Bonjour,
Je rencontre actuellement un soucis pour retrouver une valeur dans un tableau à 2 dimension. En fait je souhaite accéder à une valeur de ce tableau en fonction d'un paraméter (ie la langue de l'utilisateur)
Le code suivant :
#define FR 0
#define EN 1
#define label1 0
#define label2 1
#define label3 2
const char * const labels[][2] PROGMEM = {
{"FR Label 1", "EN Label 1"},
{"FR Label 2", "EN Label 2"},
{"FR Label 3", "EN Label 3"}
};
struct __attribute__ ((packed)) _paramS {
byte language;
byte param1;
} parameters ;
void setup() {
Serial.begin(9600);
}
void loop() {
parameters.language = FR;
parameters.param1 = 1;
Serial.println("############################");
Serial.print("******* Get value with params :");
/* KO */
Serial.println(labels[label1][parameters.language]);
Serial.println("############################");
Serial.print("Value for label1 : ");
Serial.println(label1);
Serial.print("Value for Language : ");
Serial.println(parameters.language);
Serial.print("******* Value with HardCoded index :");
/* OK */
Serial.println(labels[0][0]);
Serial.print("******* Get value with HardCodedlanguage :");
/* OK */
Serial.println(labels[label1][0]);
byte lang = parameters.language;
Serial.print("Lang VAR =");
Serial.println(lang);
Serial.print("******* Get value with var as Lan :");
/*KO*/
Serial.println(labels[label1][lang]);
Serial.print("############################");
delay(10000);
}
fournis les résultats suivant :
########################################################
******* Get value with params :
############################
Value for label1 : 0
Value for Language : 0
******* Value with HardCoded index :FR Label 1
******* Get value with HardCodedlanguage :FR Label 1
Lang VAR =0
******* Get value with var as Lan :
############################
=> la question est donc pourquoi la première ligne est vide ? pourquoi lorsque la langue est utilisée en tant qu'index dans le tableau on ne récupére pas la valeur souhaitée... (ie 'FR Label1')
Merci d'avance
PS : ce code ne sert à rien d'autre que présenter de manière la + simple possible le soucis, et n'est pas le but en soi.
Il doit y avoir une subtilité liée au C++ que je ne maîtrise pas : tu as essayé de contourner en mettant lang = FR ? Sinon, je ne sais pas, i faut attendre que les cadors de la programmation soient réveillés...
Je travaille beaucoup sur du logiciel embarqué et habituellement le "const" suffit pour qu'une constante soit placée en FLASH par le linker.
Ensuite, pour accéder à cette constante, nul besoin de fonction d'accès étant donné que les constantes sont situées dans un espace adressable en direct au même titre que le code.
En tous cas, quand je compile ce sketch avec ou sans PROGMEM, l'espace occupé par le code et les constantes est le même.
Sur ARDUINO, je ne comprends pas bien l'intérêt de PROGMEM, sauf s'il s'agit d'une interface permettant d'accéder à une FLASH autre que celle où se situe le programme, FLASH série par exemple.
Merci à tous et surtout fdufnews(...) problème résolu !
Effectivement pas scrollé tout en bas de la doc pour voir qu'en fait c'est documenté.
On veut souvent aller droit au but et on y va un peu vite.
Quant à l'utilisation de PROGMEM, le projet 'global' va s’avérer assez gourmand et je préférai stocker ces valeurs qui sont constantes dans cette espace plus large... L'avenir seul dira si le choix est opportun...