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 逐步执行此函数,它不会通过任何情况,而是在 switch 情况下通过默认值。
我的目标是该缓冲区应该有 RED 而不是它对应的枚举值,即 64。

编译器:Windows XP 上的 gcc 3.4.5

4

3 回答 3

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);
}
于 2012-05-29T15:05:56.210 回答
0

我复制粘贴了你的代码。只是对函数调用做了一个小改动。它给了我想要的输出。

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

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

于 2012-05-30T06:51:37.020 回答
0

MapFormatToString尝试打印格式内的值:

printf("%x", format);

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

于 2012-05-29T15:41:25.130 回答