Hello,
Ce petit programme me rend fou... Il y a le calcul du nombre d'éléments de deux tables (c'est un truc qu'on utilise le plus souvent possible en embarqué pour ne pas créer de variables). Puis vient ensuite la partie de code préprocesseur qui est sensée comparer les deux tailles et générer une erreur si elles sont différentes. C'est la partie que j'avoue ne pas gérer, bien que ce soit du C plus que standard. mais:
- Si on commente les trois lignes de préprocesseur, la fonction setup() affiche correctement les 2 tailles.
- Si je remplace les 2 tailles par des nombres différents, le code fonctionne et signale l'erreur.
J'en conclus qu'il y a un truc que je n'ai as compris dans le #if, mais quoi? Mon code à l'air de ressembler à tout ce que j'ai vu sur le sujet.
A+
Pfeuh
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 typedef bool (*callback)(); bool f_a(){Serial.print("function a invoked\n");return false;} bool f_b(){Serial.print("function b invoked\n");return false;} bool f_c(){Serial.print("function c invoked\n");return false;} const callback userFunctions[] PROGMEM { f_a, f_b, f_c, }; #define NB_USER_FUNCTIONS (sizeof(userFunctions) / sizeof(callback)) const char userFname1[] PROGMEM = ("fct_a"); const char userFname2[] PROGMEM = ("fct_b"); const char userFname3[] PROGMEM = ("fct_c"); const char *const userFunctionNames[] PROGMEM = { userFname1, userFname2, userFname3, }; #define NB_USER_FUNCTION_NAMES (sizeof(userFunctionNames) / sizeof(char*)) #if (NB_USER_FUNCTION_NAMES != NB_USER_FUNCTIONS) #error Not same number of functions and function's names for user's commands #endif void setup() { Serial.begin(9600); Serial.print(NB_USER_FUNCTIONS); Serial.print(F(" functions in the jump table\n")); Serial.print(NB_USER_FUNCTION_NAMES); Serial.print(F(" strings in the string table\n")); pinMode(LED_BUILTIN, OUTPUT); } void loop() { if(millis() & 0x200) digitalWrite(LED_BUILTIN, 0); else digitalWrite(LED_BUILTIN, 1); }
Partager