C macro: transforme un nombre en chaîne

J’ai un tableau qui définit l’apparence des symboles sur un écran 5×7 points. Quelque chose comme:

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. 

La partie avant de la table correspond à la table ASCII, suivie d’un ensemble de symboles spéciaux, par exemple une flèche ou une coche. Pour référencer ceux-ci, j’ai une liste de macros:

 #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) 

Maintenant, je dois dire quelque chose comme (ne comstackra pas):

 const char * const message = "Next" + SYMBOL_RIGHT_ARROW; 

Question: Comment convertir SYMBOL_RIGHT_ARROW en “\ x79”, ou une chaîne entière en "Next\x79" AU MOMENT DE L’APTITUDE, de manière à pouvoir afficher la chaîne en section R / O?

Freescale HC08 C-compilateur.

Vous pouvez concaténer des chaînes en source C:

 printf("%s\n", "forty" "two"); /* prints "fortytwo" */ /* NOTE: ^^^ no punctuation */ 

Faire cela avec vos symboles représente beaucoup de travail, mais vous pouvez peut-être vivre avec cela.

 #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; 

METTRE À JOUR

Si vous pouvez faire correspondre la valeur du symbole à sa position dans la table des symboles (120 correspond “\ x78”), essayez ces macros

 #include  #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; } 

Modifier (SO n’aime pas mon navigateur)

Après l’extension de la macro, SYMBOL_NUM(32) est transformé en un entier littéral ( 0x78 ); et SYMBOL_STR(78) est transformé en un littéral de chaîne ( "\x78" ).

Vous pouvez utiliser les littéraux comme si vous les aviez tapés.

 const char *test = "Next" SYMBOL_STR(78) " one"; /* same as const char *test = "Next\x78 one"; */ 

Je suis venu avec ce petit programme:

 #include  #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; } 

l’indirection dans la macro est nécessaire pour que votre personnage soit développé avant que le “#” ne le transforme en chaîne. remarquez que la valeur ‘\ x77’ se transforme en un int valide lorsque vous l’utilisez de cette façon …

C’est le mieux que je puisse trouver, pas parfait, mais peut être mis en ROM:

 const char message[] = {'N','e','x','t',SYMBOL_RIGHT_ARROW,EOS};