Problema con tipo unsigned char - TDM-GCC 4.9.2 (64bit version) (DevC)

di il
6 risposte

Problema con tipo unsigned char - TDM-GCC 4.9.2 (64bit version) (DevC)

Salve, ho un problema con l'utilizzo degli unsigned char nel mio programma. Devo semplicemente leggere da input 3 età e calcolarne la media(molto banale, sono all'università e sto riguardando gli argomenti). Sono però a un punto di stallo.
Semplicemente ho pensato di usare degli unsigned char per l'età per una “ottimizzazione”(almeno formale) del codice. Il problema è che devo svolgere gli esercizi su DevC++, che utilizza ancora versioni vecchissime di GCC. Non riesco a capire cosa sto sbagliando, ho provato anche a cambiare in %u ma non funziona lo stesso. Il codice è:

#include <stdio.h>
int main()
{
    unsigned char a=0, b=0, c=0;
    
    scanf("%hhu", &a);
    printf("AddrA: %p\n", &a);
    scanf("%hhu", &b);
    printf("AddrB: %p\n", &b);
    scanf("%hhu", &c);
    printf("AddrC: %p\n", &c);
    
    printf("A: %hhu\t", a);
    printf("B: %hhu\t", b);
    printf("C: %hhu\t", c);
    return 0;
}

Se in input do a=1, b=2, c=3 l'output sul mio compiler è:

1
AddrA: 000000000062FE1F
2
AddrB: 000000000062FE1E
3
AddrC: 000000000062FE1D
A: 0    B: 0    c: 3

(ovviamente dovrebbe semplicemente stampare A: 1, B:2, C:3).

Avete qualche idea su come poter risolvere? Devo utilizzare per forza questa versione siccome farò 2 esami in laboratorio proprio su Dev-C++ -.-.
Grazie mille in anticipo.

6 Risposte

  • Re: Problema con tipo unsigned char - TDM-GCC 4.9.2 (64bit version) (DevC)

    Il codice è corretto e con Visual C++ ottengo

    1
    AddrA: 000000C0D7EFF5F4
    2
    AddrB: 000000C0D7EFF614
    3
    AddrC: 000000C0D7EFF634
    A: 1    B: 2    C: 3

    Però ho visto nel tuo messaggio che nell'ultima riga c'è scritto

    A: 0    B: 0    c: 3

    con la c minuscola e non C maiuscola come nel codice che hai mostrato.

    Non è che stai usando un codice diverso e probabilmente con qualche errore?

  • Re: Problema con tipo unsigned char - TDM-GCC 4.9.2 (64bit version) (DevC)

    06/10/2023 - oregon ha scritto:


    Il codice è corretto e con Visual C++ ottengo

    1
    AddrA: 000000C0D7EFF5F4
    2
    AddrB: 000000C0D7EFF614
    3
    AddrC: 000000C0D7EFF634
    A: 1    B: 2    C: 3

    Però ho visto nel tuo messaggio che nell'ultima riga c'è scritto

    A: 0    B: 0    c: 3

    con la c minuscola e non C maiuscola come nel codice che hai mostrato.

    Non è che stai usando un codice diverso e probabilmente con qualche errore?

    Nono è semplicemente un Typo nella stampa, sorry. Ho scoperto che nello standard che utilizza questo compilatore %hhu non esiste nemmeno xD. Il problema è che non capisco come utilizzarli in questo caso… Non posso cambiare compilatore ma non posso nemmeno scrivere codice errato, bella cosa l'Università.

  • Re: Problema con tipo unsigned char - TDM-GCC 4.9.2 (64bit version) (DevC)

    Se proprio vuoi usare l'unsigned char, allora ti serve %hhu

  • Re: Problema con tipo unsigned char - TDM-GCC 4.9.2 (64bit version) (DevC)

    06/10/2023 - oregon ha scritto:


    Se proprio vuoi usare l'unsigned char, allora ti serve %hhu

    E allora andrò di unsigned Int… Non capisco il senso di creare gli unsigned char in uno standard e non farli utilizzare. 

  • Re: Problema con tipo unsigned char - TDM-GCC 4.9.2 (64bit version) (DevC)

    Certo che si usano. Non solo direttamente nella scanf ma ovunque nei codici.

  • Re: Problema con tipo unsigned char - TDM-GCC 4.9.2 (64bit version) (DevC)

    Ciao.

    Siccome lo uso da anni Dev-C++ (versione Orwell) e mi trovo bene, mi sento quasi chiamato in causa :)

    Ho fatto delle prove con il tuo codice ed in effetti ottengo lo stesso tuo risultato. Quindi ho provato ad eseguire il debug con l'osservazione delle tre variabili a,b e c ed ho notato che ad ogni successiva operazione di scanf le variabili precedenti vengono azzerate. Lo stesso avviene anche con la versione curata da Embarcadero che usa TDM-GCC 9.2.0.
    Dichiarando invece le variabili globali, cioè fuori dal main, il programma fornisce l'output corretto.

    In rete ho trovato questa discussione:

    https://stackoverflow.com/questions/15825254/why-is-scanfhhu-char-overwriting-other-variables-when-they-are-local

    che avvalora quanto scritto. Probabilmente è dovuto proprio al TDM-GCC. 

    Qui viene svelato l'arcano:
    "As you note, scanf() is provided by MSVCRT.DLL ... a Microsoft product. You are correct that it isn't C99, (because, in reality, Microsoft have never supported that). Read the MSDN documentation; that's what you must code to. This is a "won't fix", because the reality is that it's a "can't fix" -- the implementation isn't open source, or free software; it's a Microsoft product which we cannot alter, (unless someone has sufficient incentive to provide a complete replacement implementation, and since scanf() is such an appallingly dreadful choice of API anyway, few have)."

    In ogni caso, se non esplicitamente richiesto dall'esercizio ha poco senso l'uso dei char al posto degli int per lavorare con numeri piccoli: non siamo negli anni ‘50 o ’60 dove la memoria era dell'ordine delle centinaia di byte.

    P.S. con %u funziona, purché lo usi anche nella funzione scanf, che è quella che può dare problemi in Dev-C++

    P.P.S. per curiosità, quale università frequenti e quale indirizzo?

Devi accedere o registrarti per scrivere nel forum
6 risposte