Valeur d'un tableau à deux dimension

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.

Essaye de déclarer lang en int au lieu de byte ... ?

Merci pour la réponse rapide, mais pas mieux...
La forme souhaitée d’accès à la valeur est

labels[label1][parameters.language]

L'utilisation de 'lang' est une tentative de contournement, mais sans succés (ni en byte, ni en int) :confused:

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...

Salut

Apparemment PROGMEN n'est pas aussi trivial.

Sinon, supprime PROGMEM.

@+

Il faut remplacer

const char * const labels[][2] PROGMEM = {
  {"FR Label 1", "EN Label 1"},
  {"FR Label 2", "EN Label 2"},
  {"FR Label 3", "EN Label 3"}
};

par

const char * stf1="FR Label 1";
const char * stf2="FR Label 2";
const char * stf3="FR Label 3";
const char * ste1="EN Label 1";
const char * ste2="EN Label 2";
const char * ste3="EN Label 3";

const char * const labels[3][2] PROGMEM = {
  {stf1, ste1},
  {stf2, ste2},
  {stf3, ste3}
};

oui mais dans ce cas seuls les pointeurs sont en PROGMEM.
Les chaînes elles-mêmes sont en RAM.

Pour mettre les chaines en Flash il faut suivre l'exemple dans la rubrique PROGMEM de l'arduino reference

Tu pourrais faire comme ça par exemple

#define FR 0
#define EN 1

#define label1 0
#define label2 1
#define label3 2

char buffer[20]; // mettre à la taille maximum d'un label

const char stf1[] PROGMEM ="FR Label 1";
const char stf2[] PROGMEM ="FR Label 2";
const char stf3[] PROGMEM ="FR Label 3";
const char ste1[] PROGMEM ="EN Label 1";
const char ste2[] PROGMEM ="EN Label 2";
const char ste3[] PROGMEM ="EN Label 3";

const char * const labels[] PROGMEM = {stf1, ste1,stf2, ste2,stf3, ste3};

struct __attribute__ ((packed)) _paramS {
  byte language;
  byte param1;
} parameters ;

char * getFString(byte i,byte j){
  strcpy_P(buffer,(char*)pgm_read_word(&(labels[2*i+j])));
  return(buffer);
}

void setup() {
  Serial.begin(9600);

}

void loop() {
  parameters.language = FR;
  parameters.param1 = 1;
  Serial.println("############################");
  Serial.print("******* Get value with params :");
  /* KO */
  Serial.println(getFString(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(getFString(0,0));
  Serial.print("******* Get value with HardCodedlanguage :");
  /* OK */
  Serial.println(getFString(1,0));
  byte lang = parameters.language;
  Serial.print("Lang VAR =");
  Serial.println(lang);
  Serial.print("******* Get value with var as Lan :");
  /*KO*/
  Serial.println(getFString(label1,lang));
  Serial.print("############################");
  delay(10000);

}

Salut

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.

@+

pepe:
Mais c'est exactement ce que j'ai écrit.

Désolé, nous avons posté en même temps. Je ne répondais pas à ton post, mais au précédent.

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é. :confused:
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...

Merci à tous.

OK. Merci pour l'info.
Venant du monde STM32 et ARM7, je m'imaginais les choses plus simplement.

@+