在案例中的枚举

时间:2012-05-29 14:26:58

标签: c enums

这段代码出了什么问题:

#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单步执行此功能,它不会通过任何情况下降,而是在开关盒中默认下降。
      我的目标是缓冲区中应该有RED而不是相应的枚举值,即64。

编译器:Windows XP上的gcc 3.4.5

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

MapFormatToString尝试打印格式内的值:

printf("%x", format);

如果你没有得到64(0x64,那就是),这意味着在格式分配和在MapFormatToString内读取它之间出现了问题。例如,如果将枚举视为32位整数,则在转换uint8时可能会发生某种情况。 另外,首先尝试不传递缓冲区,只打印格式值。

答案 2 :(得分:0)

我复制了你的代码。只是对函数调用做了一个小改动。它根据需要提供输出。

更改:而不是&amp;缓冲区,传递缓冲区

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

相关问题