2012-05-29 117 views
4

有什麼不對這段代碼:枚舉在開關的情況下

#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"); 
    } 
} 

如果我通過與myformat此功能步驟= RED,它不屬於通過任何的情況下,反而落在通過默認的開關案件。
我的目標是到緩衝區應該有紅色的它,而不是它的對應枚舉值即64

編譯

:GCC 3.4.5在Windows XP

+9

嘗試將函數參數類型更改爲枚舉格式。一個枚舉不保證是uint8_t –

+0

某些實現定義爲'__int8_t'。 – Jack

+0

嘗試將'printf(「%08x%08x \ n」,format,A);'添加到'MapFormattToString'。它會告訴你到底是什麼與什麼相比。我想其中之一將不會是你所期望的。 – ugoren

回答

4

我只是寫了下面的程序,編譯它,測試它,輸出是:

$ ./test 
    d 
    e 

$ 

這正是你所期望的。希望這可以幫助您發現程序中的一些差異。

#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); 
} 
+0

我已經在我的問題中添加了更多信息 – user1377944

+0

好的,我修改了我的C程序並按照您的指示進行了修改 - 結果完全相同。你能否像我一樣編一個C程序,編譯並運行它,看看你是否得到了相同的結果?也許你遇到了一些奇怪的編譯器錯誤。我使用gcc編譯我的。 –

0

MapFormatToString嘗試打印內部格式值:

printf("%x", format);

如果你沒有得到64(0x64,這是),這意味着什麼分配之間出了錯格式化和讀它在MapFormatToString內。例如,如果枚舉被視爲32位整數,則轉換uint8時可能會發生一些情況。 另外,儘量不要先傳遞緩衝區,只打印格式的值。

+0

當我看到格式的值是A(65) – user1377944

0

我複製粘貼你的代碼。只是對函數調用做了一點改動。它根據需要給我輸出。

變化:代替&緩衝器,通過緩衝

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

這裏是供參考的主要功能:

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); 
} 

編譯器用於:GCC(Ubuntu的/ Linaro的4.6.3-1ubuntu5) 4.6.3