PDA

Visualizza la versione completa : [C] dubbi e perplessità sulla dichiarazione di costanti con #define


skricchi
22-07-2009, 11:45
ciao a tutti, sto facendo un controllo su del codice da me scritto e mi è venuto un dubbio:

quando io faccio una define di un codice di errore, ad esempio:

#define ERR_OUTDATE -29

sto definendo un int che in teoria sarebbe di 4 bytes. se però questo int lo uso per creare una stringa dichiarata come array di char, il -29 quanto spazio prende????
In breve questa stringa deve contenere una serie di codici errore che potrebbero generarsi durante l'esecuzione e non definibili a priori...posso solo sapere al massimo quanti codici potrebbero esserci....:bhò: :bhò:

ESSE-EFFE
22-07-2009, 11:58
#define ERR_OUTDATE -29

sto definendo un int che in teoria sarebbe di 4 bytes


Assolutamente no. Il preprocessore semplicemente sostituirà tutte le occorrenze di ERR_OUTDATE nel codice con -29.

skricchi
22-07-2009, 12:03
Assolutamente no. Il preprocessore semplicemente sostituirà tutte le occorrenze di ERR_OUTDATE nel codice con -29.

su questo hai assolutamente ragione e lo so anche io, il punto è che non riesco a capire questo -29 se io lo richiamo per inserirlo in un array di char ad esempio in questo modo:


sprintf(warning, "%d,", ERR_OUTDATE);

quanto spazio prende????

MItaly
22-07-2009, 12:13
Se ho capito quello che chiedi, vuoi sapere quanto può essere lungo al massimo un int trasformato in stringa, o sbaglio?
Considerando interi a 32 bit senza segno si può facilmente calcolare che 2^32-1=4294967295, che si scrive con 10 cifre decimali; con segno il numero più lungo che ci può essere è -2^31=-2147483648, lungo 11 cifre decimali. Con interi a n bit il ragionamento è sempre lo stesso: l'intero senza segno più lungo sarà 2^n-1, mentre quello con segno -2^(n-1).
Per evitare calcoli astrusi, comunque, io di solito visualizzo i codici di errore in esadecimale, per cui c'è una corrispondenza immediata tra bit della variabile e cifre esadecimale utilizzate (dato che 4 bit=una cifra esadecimale); inoltre visualizzare i codici di errore in esadecimale è molto più tennico :D .

Originariamente inviato da skricchi
su questo hai assolutamente ragione e lo so anche io, il punto è che non riesco a capire questo -29 se io lo richiamo per inserirlo in un array di char ad esempio in questo modo:


sprintf(warning, "%d,", ERR_OUTDATE);

quanto spazio prende????
Tre caratteri più il NUL finale. Comunque da questo punto di vista puoi anche fare così:


#define STRINGIFY(x) #x

#define TOSTRING(x) STRINGIFY(x)

const char * warning = TOSTRING(ERR_OUTDATE);

e non te ne devi preoccupare più, visto che il puntatore in questione sarà sempre valido. Infatti dopo la passata del precompilatore diventerà:


const char * warning = "-29";
.

skricchi
22-07-2009, 12:23
hai preso in pieno il problema.....grazie

penso che passerò agli esadecimanli anche io!!!!!!!!! :yuppi:

ESSE-EFFE
22-07-2009, 13:33
su questo hai assolutamente ragione e lo so anche io,


Beh il mio commento era riferito alla frase "sto definendo un int che in teoria sarebbe di 4 bytes" che, relativamente al #define, non è corretta.

Oltre a quanto è già stato detto, aggiungo che nel C99 è stata introdotta la funzione snprintf con la quale è possibile sapere quanto spazio è necessario allocare.

LeleFT
22-07-2009, 13:52
Attenzione al titolo della discussione... "dubbi e peplessità" possono nascere per qualunque cosa. Di conseguenza, tale titolo non dice assolutamente nulla del contenuto della discussione, senza un'ovvia (e necessaria) precisazione.


Ciao. :ciauz:

Loading