Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Samsung Micro RGB R95H, il primo LCD a LED rossi, verdi e blu di Samsung alla prova del banco di misura
Samsung Micro RGB R95H, il primo LCD a LED rossi, verdi e blu di Samsung alla prova del banco di misura
Il primo Micro RGB di Samsung per il salotto è il 65 pollici da 2.749 euro. Sul banco di misura abbiamo rilevato 2.000 nit di picco, nero assoluto con il local dimming e il 91,4% del BT.2020, il colore più ampio che abbiamo misurato su un LCD
iPhone 18 Pro: la recensione del miglior iPhone compatto di sempre
iPhone 18 Pro: la recensione del miglior iPhone compatto di sempre
Apple ha rinnovato iPhone 18 Pro soprattutto dentro: chip A20 Pro a 2 nm con memoria affiancata al SoC, camera di vapore tre volte più ampia, Dynamic Island più piccola del 25% grazie a Face ID sotto il display e fotocamera principale con diaframma variabile da f/1.48 a f/4. Lo abbiamo misurato al colorimetro e nei benchmark, usato con iOS 27 e messo alla prova in fotografia tra laghi, borghi e interni poco illuminati
Panasonic, 30 anni di Toughbook: la "Bibbia" di mille regole dietro i nuovi G3 e 34
Panasonic, 30 anni di Toughbook: la "Bibbia" di mille regole dietro i nuovi G3 e 34
A Londra, per il trentennale dei Toughbook, Panasonic ha presentato il tablet G3 e il 2-in-1 34. Con Jon Tucker, a capo dell'ingegneria europea, abbiamo parlato di ciò che non si vede: batterie, antenne, porte seriali e accorgimenti nati sul campo
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 20-09-2007, 10:05   #1
magix2003
Senior Member
 
L'Avatar di magix2003
 
Iscritto dal: Aug 2005
Città: Wien
Messaggi: 435
[C] Problema con i puntatori e la connessa aritmetica

Ciao a tutti,
mi sto leggendo il capitolo sui puntatori del K&R. Ho provato a compilare un esercizio, precisamente questo:
Codice:
#define ALLOCSIZE 1000

static char allocbuf[ALLOCSIZE];
static char *allocp = allocbuf;		/* puntatore al primo elemento dell'array */

char *alloc(int n) {
	if (allocbuf + ALLOCSIZE - allocp >= n) {		/* controlla se c'è sufficiente spazio */
		allocp += n;
		return allocp - n;
	} else {
		return 0;
	}
}

void afree(char *p) {
	if (p >= allocbuf && p < allocbuf + ALLOCSIZE) 
		allocp = p;
}
Non è altro che un semplice allocatore di memoria. Dopodichè io ho cercato di scrivere un semplice "client" e qui sono sorti i primi problemi

Codice:
#include "allocatore.h"
#include <stdio.h>

int main() {
	
	char *tmp = alloc(5);
	int i = (int) tmp + 5;
	for (++tmp; tmp < i; ++tmp) 
		*(tmp++) = 'c';
	*tmp = '\0';
	printf("%s\n", *tmp);
	return 0;
}
In questo modo non dovrei riuscire a scrivere all'interno dello spazio allocato? Quando cerco di stampare mi ritorna sempre NULL...
Grazie in anticipo

Giorgio
__________________
"Sono 126 miglia per Chicago. Abbiamo il serbatoio pieno, mezzo pacchetto di sigarette, è buio, e portiamo tutt'e due gli occhiali da sole"

magix2003 è offline   Rispondi citando il messaggio o parte di esso
Old 20-09-2007, 10:28   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da magix2003 Guarda i messaggi
In questo modo non dovrei riuscire a scrivere all'interno dello spazio allocato? Quando cerco di stampare mi ritorna sempre NULL...
Se richiedi 5 byte, allora puoi scrivere 4 caratteri più un nullo finale. A parte che fare un cast a int di un puntatore non mi sembra la cosa più bella e utile possibile.... comunque il loop non mi sembra nemmeno corretto (troppi incrementi!).

E in ogni caso alla fine vuoi stampare una stringa (%s) ma passi un carattere *tmp (ed è sbagliato) e in ogni caso il puntatore è ormai sul nullo finale.
__________________
Andrea, Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 20-09-2007, 11:08   #3
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Codice:
#include "allocatore.h"
#include <stdio.h>

int main() {
	
	char *tmp = alloc(5);
	int i = (int) tmp + 5;
	for (++tmp; tmp < i; ++tmp) 
		*(tmp++) = 'c';
	*tmp = '\0';
	printf("%s\n", *tmp);
	return 0;
}
perche´ chiami le funzioni alloc e free quando invece non fanno alloc e tantomeno free ?

perche´ per un semplice ciclo casti un char* ad int ?

capisco tu voglia sperimentare i brividi della dinamicita´ ma se il tutto si basa su un dato fisso (5)
a questo punto definiscilo ed usa la define ovunque

Poi se usi questo ciclo:
Codice:
for (++tmp; tmp < i; ++tmp)
ti giochi il primo elemento di tmp perche´ ++tmp e´ la prima istruzione che
viene eseguita.

Codice:
*tmp = '\0';
qui sei fuori dal ciclo quindi l´ultima istruzione eseguita e´ stata ++tmp
il che significa che tmp punta a tmp+6, fuori dall´array, hai sforato.
Ti va bene (ma non sempre) e non crasha il programma ma se poi stampi
Codice:
printf("%s\n", *tmp);
e tmp e´ ´\0´ e´ facile che non ti stampi un accidente.
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 20-09-2007, 11:30   #4
magix2003
Senior Member
 
L'Avatar di magix2003
 
Iscritto dal: Aug 2005
Città: Wien
Messaggi: 435
Quote:
Originariamente inviato da andbin Guarda i messaggi
Se richiedi 5 byte, allora puoi scrivere 4 caratteri più un nullo finale. A parte che fare un cast a int di un puntatore non mi sembra la cosa più bella e utile possibile.... comunque il loop non mi sembra nemmeno corretto (troppi incrementi!).

E in ogni caso alla fine vuoi stampare una stringa (%s) ma passi un carattere *tmp (ed è sbagliato) e in ogni caso il puntatore è ormai sul nullo finale.
Effettivamente ho fatto un po' di confusione, ma ho sempre avuto problemi con i pointers

Ora ho provato a modificare così il main:
Codice:
#include "allocatore.h"
#include <stdio.h>

int main() {
	
	char *tmp = alloc(5);  //alloco 5 byte
	char *p = tmp + 4;     // fine del ciclo dopo 4 byte
	char c = 'a';   
	for (tmp; tmp < p; tmp++) 
		*tmp = c++;        // scrivo all'interno di tmp il carattere c
	*tmp = '\0';                     // al termine inserisco il carattere di chiusura
	printf("%s\n", tmp);        //dovrei stampare tutto a video
	return 0;
}
Il problema è che non stampa a video, cioé mi stampa solo una riga vuota...
__________________
"Sono 126 miglia per Chicago. Abbiamo il serbatoio pieno, mezzo pacchetto di sigarette, è buio, e portiamo tutt'e due gli occhiali da sole"

magix2003 è offline   Rispondi citando il messaggio o parte di esso
Old 20-09-2007, 12:00   #5
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da magix2003 Guarda i messaggi
Il problema è che non stampa a video, cioé mi stampa solo una riga vuota...
io ti ho scritto perche´
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 20-09-2007, 12:16   #6
magix2003
Senior Member
 
L'Avatar di magix2003
 
Iscritto dal: Aug 2005
Città: Wien
Messaggi: 435
Quote:
Originariamente inviato da trallallero Guarda i messaggi
io ti ho scritto perche´
Si, ma ora uso il puntatore tmp all'interno della printf, quindi si dovrebbe riferire a tutta la stringa. O?
__________________
"Sono 126 miglia per Chicago. Abbiamo il serbatoio pieno, mezzo pacchetto di sigarette, è buio, e portiamo tutt'e due gli occhiali da sole"

magix2003 è offline   Rispondi citando il messaggio o parte di esso
Old 20-09-2007, 12:23   #7
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da magix2003 Guarda i messaggi
Si, ma ora uso il puntatore tmp all'interno della printf, quindi si dovrebbe riferire a tutta la stringa. O?
no, tu tmp lo incrementi:
Codice:
for (tmp; tmp < p; tmp++)
significa che ad ogni giro del ciclo tmp punta all´indice successivo.

Alla fine del ciclo punta alla fine dell´array.
Infatti alla fine del ciclo tu setsso fai:
Codice:
*tmp = '\0';
Di solito si usano scorritori in questi casi. NON puoi perderti l´inizio dell´array soprattutto se allocato dinamicamente, anche per poter poi liberare la memoria.

ti consiglio (cosi´ al volo) un:
Codice:
char *array = alloc(5);
char *tmp   = array;

// usi tmp per fare quello che fai e la printf diventa:
printf("%s\n", array);
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 20-09-2007, 12:25   #8
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da trallallero Guarda i messaggi
perche´ chiami le funzioni alloc e free quando invece non fanno alloc e tantomeno free ?
ma dove la vedi la free?
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 20-09-2007, 12:28   #9
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da 71104 Guarda i messaggi
ma dove la vedi la free?
Codice:
void afree(char *p) {
	if (p >= allocbuf && p < allocbuf + ALLOCSIZE) 
		allocp = p;
}


che poi e´ anche in romano, la dovresti vedere bene tu ... afree
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 20-09-2007, 12:47   #10
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da trallallero Guarda i messaggi
Codice:
void afree(char *p) {
	if (p >= allocbuf && p < allocbuf + ALLOCSIZE) 
		allocp = p;
}


che poi e´ anche in romano, la dovresti vedere bene tu ... afree
AAAAAA ECCO, afree, volevo ben dire
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 20-09-2007, 13:03   #11
magix2003
Senior Member
 
L'Avatar di magix2003
 
Iscritto dal: Aug 2005
Città: Wien
Messaggi: 435
Grazie mille,
sono proprio rintronato oggi..

Ciauz
__________________
"Sono 126 miglia per Chicago. Abbiamo il serbatoio pieno, mezzo pacchetto di sigarette, è buio, e portiamo tutt'e due gli occhiali da sole"

magix2003 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Samsung Micro RGB R95H, il primo LCD a LED rossi, verdi e blu di Samsung alla prova del banco di misura Samsung Micro RGB R95H, il primo LCD a LED rossi...
iPhone 18 Pro: la recensione del miglior iPhone compatto di sempre iPhone 18 Pro: la recensione del miglior iPhone ...
Panasonic, 30 anni di Toughbook: la "Bibbia" di mille regole dietro i nuovi G3 e 34 Panasonic, 30 anni di Toughbook: la "Bibbia...
realme C100x, lo smartphone economico con la batteria da 7500 mAh. La recensione realme C100x, lo smartphone economico con la bat...
Star Wars Zero Company è l'erede di XCOM 2 Star Wars Zero Company è l'erede di XCOM ...
Il Dipartimento della Guerra USA pensa a...
SpaceX ha lanciato le missioni Crew-13, ...
DJI Avata 2 in offerta Prime: drone FPV ...
Microsoft vuole far agire l'IA prima anc...
Ginga porta il monitoraggio delle perfor...
Tesla sorprende Wall Street: 486.532 con...
Cosa succede alle ossa degli astronauti ...
AgriEuro Premium Days: il 6 e 7 ottobre ...
259 euro per 2 TB di SSD PCIe 4.0 (Biwin...
GPT-6 Astra decifra dopo 217 anni una le...
Roborock Saros 20 Neo: pulisce al meglio...
Samsung Galaxy S27 Ultra, nuove conferme...
Offerte Prime Candy: lavatrice ProWash 3...
Tegola su Anthropic, gli agenti AI valgo...
E-bike in carbonio con un prezzo assurdo...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 23:46.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v