Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di autior
    Registrato dal
    May 2010
    Messaggi
    17

    [C] Problema con variabili char.

    Salve a tutti!

    Ho un problema che non mi riesco a spiegare, ma penso sia collegato a qualche operazione che viene eseguita sulla memoria (della quale non ho la più pallida idea )

    In pratica, quando dichiaro 2 variabili char, e successivamente le "riempio" tramite scanf, la prima variabile dichiarata viene azzerata.

    Esempio:
    #include <stdio.h>

    void main () {
    char op1,op2;
    printf("Primo operando: ");
    scanf("%d",&op1);
    printf("Secondo operando: ");
    scanf("%d",&op2);
    }

    Come primo operando inserisco, ad esempio, 12, ed il debug mi indica che viene regolarmente salvato in memoria. Dopo, se come secondo operando inserisco 13, op1 risulta uguale a 0 e op2 uguale a 13. Per aggirare il problema sono costretto sono costretto a "riempire" le variabili char nell'ordine opposto rispetto a quello con cui sono state dichiarate (nell esempio precedente quindi, dovrei effettuare la scanf prima su op2 e poi su op1).

    Come posso rsolvere questo problema? (mi scusa se è una domanda da novellini, è che anche cercando in rete non sono riuscito a trovare niente a riguardo.. )

    P.S. : Utilizzo i char per una questione di comodità, dato che devo utilizzarli con operatori bitwise, e quindi mi risulta più semplice effettuare dei "test su carta" con gli 8 bit di un char rispetto ai 16 bit di uno short int, per esempio..

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Utilizza un int per accettare i valori e convertilo in char quando ti serve.

    P.S. Non vedo perchè non utilizzare un int direttamente ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    225
    il comportamento che riscontri dipende dal fatto che un char occupa un byte di memoria e un int ne occupa almeno 2.
    Dovresti fare un debuggingperchè il comportamento dipende dal compilatore, ma probabilmente il tuo compilatore alloca prima la memoria per op2 e un char affianco quella per op1 (nella dichiarazione di char op1, op2; è lasciato al compilatore decidere quale variabile allocare prima, se tu avesse dichiarato le variabili su righe separate il comportamento del tuo programma sarebbe stato diverso, ma sempre errato).
    Quando acquisisci 12 in op1, ma lo fai come int, il compilatore inserisce in memoria nel primo byte il 12 stesso, e nel secondo uno 0, in quanto lo pensa un int e non un char. Quando nella istruzione successiva acquisisci il 13 per op3, ma ancora lo fai come int, il compilatore inserisce nel primo byte il 13 stesso e nel secondo byte (che nel tuo caso corrisponde all'indirizzo di op1) inserisce uno zero.

    spero di essere stato chiaro

    ciaos

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Il problema è dato dallo switch %d della scanf che effettua l'input di un intero a 32 bit. Sono quindi scritti 4 byte nello stack e "sporcati" i char con conseguenze impredicibili ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it L'avatar di autior
    Registrato dal
    May 2010
    Messaggi
    17
    Grazie per l'aiuto.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.