这段代码出了什么问题:
#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
答案 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