我有一个表格,用于在5x7点显示屏上定义符号外观。类似的东西:
extern UINT8 symbols[][5] = {
{0x0,0x0,0x0,0x0,0x0},
{0x0,0x0,0x5F,0x0,0x0},
{0x0,0x7,0x0,0x7,0x0},
{0x14,0x7F,0x14,0x7F,0x14}, // etc.
表格的前导部分与ASCII表格匹配,后跟一组特殊符号,例如箭头或复选标记。要引用那些我有一个宏列表:
#define SYMBOL_LEFT_ARROW 120 // 120 is the entry in the table
#define SYMBOL_RIGHT_ARROW (SYMBOL_LEFT_ARROW+1)
#define SYMBOL_UP_ARROW (SYMBOL_RIGHT_ARROW+1)
现在我需要说一些(不会编译):
const char * const message = "Next" + SYMBOL_RIGHT_ARROW;
问题:如何将SYMBOL_RIGHT_ARROW
转换为“\ x79”,或将整个字符串转换为"Next\x79"
AT COMPILE TIME 以便我可以拥有R / O部分中的字符串?
Freescale HC08 C编译器。
答案 0 :(得分:13)
您可以在C源中连接字符串:
printf("%s\n", "forty" "two"); /* prints "fortytwo" */
/* NOTE: ^^^ no punctuation */
用你的符号做这件事是很多工作,但也许你可以忍受它。
#define SYMBOL_LEFT_ARROW 120
#define SYMBOL_LEFT_ARROW_STR "\x79"
#define SYMBOL_RIGHT_ARROW (SYMBOL_LEFT_ARROW + 1)
#define SYMBOL_RIGHT_ARROW_STR "\x83"
const char * const message = "Next" SYMBOL_RIGHT_ARROW_STR;
如果您可以使符号的值与符号表中的位置匹配(120匹配“\ x78”),请尝试使用这些宏
#include <stdio.h>
#define ADD_ZERO_X(y) 0x ## y
#define SYMBOL_NUM(x) ADD_ZERO_X(x)
#define STRINGIZE(z) #z
#define ADD_SLASH_X(y) STRINGIZE(\x ## y)
#define SYMBOL_STR(x) ADD_SLASH_X(x)
#define SYMBOL_LEFT_ARROW 78 /* must write in hexadecimal without any prefix */
#define SYMBOL_RIGHT_ARROW 79
#define SYMBOL_UP_ARROW 7a
int main(void) {
printf("%d\n", SYMBOL_NUM(SYMBOL_LEFT_ARROW));
printf("%s\n", SYMBOL_STR(SYMBOL_LEFT_ARROW));
printf("%d\n", SYMBOL_NUM(SYMBOL_RIGHT_ARROW));
printf("%s\n", SYMBOL_STR(SYMBOL_RIGHT_ARROW));
printf("%d\n", SYMBOL_NUM(SYMBOL_UP_ARROW));
printf("%s\n", SYMBOL_STR(SYMBOL_UP_ARROW));
return 0;
}
编辑(SO不喜欢我的浏览器)
宏扩展后SYMBOL_NUM(32)
转换为整数文字(0x78
);并且SYMBOL_STR(78)
转换为字符串文字("\x78"
)。
您可以像使用键入文字一样使用文字。
const char *test = "Next" SYMBOL_STR(78) " one";
/* same as
const char *test = "Next\x78 one";
*/
答案 1 :(得分:3)
我想出了这个小程序:
#include <stdio.h>
#define TEST_CHR '\x77'
#define VAL(x) #x
#define STRINGIFY(x) VAL(x)
int main()
{
int x = TEST_CHR;
char *yyy = "%d " STRINGIFY(TEST_CHR) "\n";
printf(yyy,x);
return 0;
}
宏中的间接是必要的,以便在“#”将其转换为字符串之前扩展您的角色。请注意,当您以这种方式使用时,'\ x77'值会变为有效的int ...
答案 2 :(得分:2)
这是我能想到的最好的,不完美,但可以放在ROM中:
const char message[] = {'N','e','x','t',SYMBOL_RIGHT_ARROW,EOS};