Bonjour,
J'ai un problème tout bête mais que je n'arrive pas à résoudre.
Dans mon code j'ai plusieurs tableaux en progmem
Attention, ce ne sont pas des chaines de caractères "normales"
Ce sont des tableaux unsigned char pouvant contenir des octets nulls, ces octets nulls font partie des données et ne doivent surtout pas être interprétés comme des marqueurs de fin de chaine.
(sinon, ça serait trop facile)
J'arrive à passer ces tableaux dans une variable qui contient leur adresse (un pointer en fait) pour les utiliser
MAIS je n'arrive pas à calculer leur taille (sizeof()) à partir de leur adresse
Voici le code de départ :
C'est très con, on ne respecte pas le principe DRY (don't repeat yourself)
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 switch (menu_index) { case Menu_3_DemoShapes: len = sizeof(Buffer_HTTP_DemoShapes); for (j=0;j<len;j++) {Buffer_HTTP[j+1] = pgm_read_byte(Buffer_HTTP_DemoShapes+j);} break; case Menu_4_DemoBitmpas: len = sizeof(Buffer_HTTP_Bitmap); for (j=0;j<len;j++) {Buffer_HTTP[j+1] = pgm_read_byte(Buffer_HTTP_Bitmap+j);} break; case Menu_5_DemoButtons: len = sizeof(Buffer_HTTP_DemoButtons); for (j=0;j<len;j++) {Buffer_HTTP[j+1] = pgm_read_byte(Buffer_HTTP_DemoButtons+j);} break; case Menu_6_DemoRainbows: len = sizeof(Buffer_HTTP_DemoRainbows); for (j=0;j<len;j++) {Buffer_HTTP[j+1] = pgm_read_byte(Buffer_HTTP_DemoRainbows+j);} break; case Menu_7_DemoSetup: len = sizeof(Buffer_HTTP_DemoSetup); for (j=0;j<len;j++) {Buffer_HTTP[j+1] = pgm_read_byte(Buffer_HTTP_DemoSetup+j);} break; case Menu_8_DemoBig1: len = sizeof(Buffer_HTTP_DemoBig1); for (j=0;j<len;j++) {Buffer_HTTP[j+1] = pgm_read_byte(Buffer_HTTP_DemoBig1+j);} break; case Menu_9_DemoBig2: len = sizeof(Buffer_HTTP_DemoBig2); for (j=0;j<len;j++) {Buffer_HTTP[j+1] = pgm_read_byte(Buffer_HTTP_DemoBig2+j);} break; }
Voici le code que je n'arrive pas à faire :
Le problème vient de sizeof(), car si je fait cela ça fonctionne :
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 uint16_t p; // valeur de l'adresse PROGMEM switch (menu_index) { case Menu_3_DemoShapes: p = Buffer_HTTP_DemoShapes; break; case Menu_4_DemoBitmpas: p = Buffer_HTTP_Bitmap; break; case Menu_5_DemoButtons: p = Buffer_HTTP_DemoButtons; break; case Menu_6_DemoRainbows: p = Buffer_HTTP_DemoRainbows; break; case Menu_7_DemoSetup: p = Buffer_HTTP_DemoSetup; break; case Menu_8_DemoBig1: p = Buffer_HTTP_DemoBig1; break; case Menu_9_DemoBig2: p = Buffer_HTTP_DemoBig2; break; } len = sizeof(p); // Evidemment ça ne fonctionne pas mais vous comprenez que je j'aimerais faire for (j=0;j<len;j++) {Buffer_HTTP[j+1] = pgm_read_byte(p+j);} // cette partie là fonctionne
J'ai regardé le code de pgmspace.h pour savoir comment pgm_read_byte() fonctionne.
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 uint16_t p; // valeur de l'adresse PROGMEM switch (menu_index) { case Menu_3_DemoShapes: len = sizeof(Buffer_HTTP_DemoShapes); p = Buffer_HTTP_DemoShapes; break; case Menu_4_DemoBitmpas: len = sizeof(Buffer_HTTP_Bitmap); p = Buffer_HTTP_Bitmap; break; case Menu_5_DemoButtons: len = sizeof(Buffer_HTTP_DemoButtons); p = Buffer_HTTP_DemoButtons; break; case Menu_6_DemoRainbows: len = sizeof(Buffer_HTTP_DemoRainbows); p = Buffer_HTTP_DemoRainbows; break; case Menu_7_DemoSetup: len = sizeof(Buffer_HTTP_DemoSetup); p = Buffer_HTTP_DemoSetup; break; case Menu_8_DemoBig1: len = sizeof(Buffer_HTTP_DemoBig1); p = Buffer_HTTP_DemoBig1; break; case Menu_9_DemoBig2: len = sizeof(Buffer_HTTP_DemoBig2); p = Buffer_HTTP_DemoBig2; break; } for (j=0;j<len;j++) {Buffer_HTTP[j+1] = pgm_read_byte(p+j);}
pgm_read_byte(addr) va lire le contenu de la ROM à l'adresse 'addr', sur un Arduino UNO (qui a moins de 64ko de ROM) 'addr' est un entier non signé sur 16 bits.
Ce n'est pas très "propre" mais cette façon de lire la flash ROM correspond à ce qu'on fait en assembleur.
Il faudrait que je trouve comment fonctionne sizeof() quand on l'appelle avec en paramètre le nom d'une variable PROGMEM...
Il y a sûrement des choses se passent au moment de la compilation, et pas seulement au niveau de l'execution...
Ca se trouve, ce que je veux faire ne sera pas possible, il faudra peut être que je construise au démarrage de mon programme un petit tableau avec les tailles, et faire quelques #defines pour éviter d'avoir des nombres magiques.
A bientôt
Partager