enum interruttore di caso

Cosa c’è di sbagliato con questo pezzo di codice:

#define str(x) #x
#define xstr(x) str(x)


typedef unsigned char   uint8_t;   
typedef enum
{

         RED = 0x64,
         GREEN = 0x65,
       /* other enum values */
         BLUE = 0x87

} Format;

char buffer[50];

/* other code and variables */

/* somewhere later in code */     

myformat = RED;
/* later calling format function */

MapFormattToString(myformat,&buffer);


void MapFormattToString(uint8_t format,char *buffer)
{    
    printf("format = %x\n",format);  /*format printf has output 64 */
    switch(format)
    {
    case RED:
        sprintf(buffer,"%s\n", xstr(RED));
        break;
    case GREEN:
        sprintf(buffer,"%s\n", xstr(GREEN));
        break;
    case BLUE:
        sprintf(buffer,"%s\n", xstr(BLUE));
        break;
    default:
        sprintf(buffer,"Unsupported color\n");
    }
}

Se io passo attraverso questa funzione con myformat = RED , non è caduta attraverso uno qualsiasi dei casi, ma invece cade attraverso default nell’interruttore caso.

Il mio obiettivo è che il buffer dovrebbe avere il ROSSO al posto del corrispondente valore di enumerazione io.e 64.

Compilatore gcc 3.4.5 su Windows XP

  • Prova a cambiare l’argomento della funzione di tipo enum Formato. Un’enumerazione non è garantita la uint8_t
  • Alcune implementazioni di definire come __int8_t.
  • Tenta di aggiungere printf("%08x %08x\n",format,A); per MapFormattToString. Essa vi mostrerà esattamente che cosa è il confronto con ciò che. Credo che uno di loro non sarà quello che vi aspettate.
  • Come è buffer definito? &buffer suggeriscono un errore.
  • Se si definisce buffer come char buffer[SIZE], &buffer è un puntatore a puntatore a char. MapFormattToString si aspetta un puntatore a char. Si dovrebbe ottenere un messaggio di avviso in merito.
  • No, &buffer è un puntatore a un array dichar. Il valore deve essere lo stesso solo buffer, ma i tipi sono diversi.

InformationsquelleAutor user1377944 | 2012-05-29



3 Replies
  1. 4

    Ho appena scritto il seguente programma, compilato e provato, e il risultato è:

    $ ./test
        d
        e
    
    $

    che è esattamente quello che ci si aspetterebbe. Spero che questo aiuta a vedere un po ‘ di differenza nel vostro programma.

    #include<stdio.h>
    
    typedef unsigned char uint8_t;
    
    typedef enum {
        RED = 0x64,
        GREEN = 0x65,
        BLUE = 0x87
    } Format;
    
    void MapFormatToString(uint8_t format, char *buffer) {
        switch (format) {
            case RED:
                sprintf(buffer, "%c\n", RED);
                break;
            case GREEN:
                sprintf(buffer, "%c\n", GREEN);
                break;
            case BLUE:
                sprintf(buffer, "%c\n", BLUE);
                break;
            default:
                sprintf(buffer, "Unknown\n");
        }
    
    }
    
    main (int argc, char *argv[]) {
        char buffer[100];
    
        MapFormatToString(RED, buffer);
        printf(buffer);
        MapFormatToString(GREEN, buffer);
        printf(buffer);
        MapFormatToString(BLUE, buffer);
        printf(buffer);
    }
    • Ho aggiunto altre info nella mia domanda
    • Ok, ho modificato il mio programma in C come da te indicato e fatto le modifiche qui — i risultati sono esattamente gli stessi. Potresti per favore fare un piccolo programma in C proprio come il mio, compilare ed eseguire esso, e vedere se il risultato è lo stesso? Forse stai incontrando qualche strano errore del compilatore. Sto usando gcc per compilare il mio.
  2. 0

    In MapFormatToString provare a stampare il valore all’interno di formato:

    printf("%x", format);

    Se non si ottiene 64 (0x64, che è), significa che qualcosa è andato storto tra l’assegnazione di formato e la lettura all’interno MapFormatToString. Per esempio, se un enum è trattato come numero intero a 32 bit, qualcosa potrebbe succedere in caso di conversione uint8.
    Inoltre, cercare di non passare il buffer in un primo momento, solo stampare il valore di formato.

    • quando vedo il valore di formato è Un (65)
  3. 0

    Ho copiato-incollato il tuo codice. Appena fatto una piccola modifica alla chiamata di funzione. Mi da come output desiderato.

    Modifica: Invece di &buffer, passare il buffer

    //MapFormattToString(myformat,&buffer);
    MapFormattToString(myformat, buffer);

    Qui è la funzione principale per il vostro riferimento:

    int main()
    {
    char buffer[50];
    
    /* other code and variables */
    
    /* somewhere later in code */
    
    Format myformat = BLUE;
    /* later calling format function */
    
    //MapFormattToString(myformat,&buffer);
    MapFormattToString(myformat, buffer);
    
    
    // MapFormattToString(0x64, buffer);
      printf("\n***** Buffer = %s\n", buffer);
    }

    Compilatore usato: gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

Lascia un commento