Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    30

    [C] dubbi e perplessità

    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....

  2. #2

    Re: [C] dubbi e perplessità

    #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.

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    30
    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:

    codice:
    sprintf(warning, "%d,", ERR_OUTDATE);
    quanto spazio prende????

  4. #4
    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 .
    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:

    codice:
    sprintf(warning, "%d,", ERR_OUTDATE);
    quanto spazio prende????
    Tre caratteri più il NUL finale. Comunque da questo punto di vista puoi anche fare così:
    codice:
    #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à:
    codice:
    const char * warning = "-29";
    .
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    30
    hai preso in pieno il problema.....grazie

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

  6. #6
    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.

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Moderazione

    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.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.