Toujours pas pigé comment marchent ces foutus pointeurs et chaines

Bonjour

je pose le contexte : j'ai une fonction Text()

void Text(const char str[]) {
  for (byte i = 0; i < strlen(str); i++) {
    Car(str[i]);
  }
}

qui fonctionne ! je fais Text("Essai"); ça roule ...

je veux coller "Essai" en mémoire pour m'en resservir

je fais:

const char Menu_001[] PROGMEM = "Essai";
const char Menu_002[] PROGMEM = "Menu2";
const char *const Menu_List[] PROGMEM = {Menu_001,Menu_001};

Question: Comment je peux afficher mon texte par la fonction Text() ? tous mes essais échouent lamentablement par un défilement continu de toutes les lettres possible et imaginables.... sur a cause de la longueur de la chaine ??

je sais que la solution est surement évidente j'ai essayé le

const __FlashStringHelper *

le
pgm_read_word(&Menu_List[index]) en combinaisons aussi bien que seuls ... pareil

dans le meilleur des cas
Text(pgm_read_word(&Menu_List[0])); affiche rien ....

merci de votre aide.

Voir là

Exemple ici :
https://bitbucket.org/henri_bachetti/alarm-system/src/master/arduino/alarm-system/lcd-display.cpp

Voir la fonction printStatus() :
lcd.print(strcpy_P(buf, (char*)pgm_read_word(&(messages[state]))));

vous ne pouvez pas car la fonction Text() attend un (pointeur sur la première case d'un) tableau en SRAM alors que si vous avez utilisé PROGMEM correctement le tableau est en FLASH

on ne peut pas différencier au run time (à cause de l'architecture dite Harvard) si un pointeur est en mémoire flash ou en mémoire SRAM. la classe Print "triche" en introduisant un nouveau type __FlashStringHelper avec F() ce qui permet au compilateur de savoir quelle version appeler

Si vous savez où se trouve le stockage, le parcours mémoire n'est pas effectué de la même façon, voici un exemple :

const char enFlash[] PROGMEM = "texte en FLASH";
const char enSRAM[] = "texte en SRAM";

void imprimeSRAM(const char * message) {
  while(*message) {
    Serial.write(*message++);
  }
}

void imprimeFlash(const char * message) {
  while(pgm_read_byte(message)) {
    Serial.write(pgm_read_byte(message++));
  }
}

void setup() {
  Serial.begin(115200);
  imprimeFlash(enFlash);  Serial.println();
  imprimeSRAM(enSRAM);    Serial.println();
}

void loop() {}

la console vous dira:

texte en FLASH
texte en SRAM
Thats all folks

Ok merci
Je suis resté bloqué a l'organisation z80 6809 en fait je me suis jamais posé la question ....

j'ai donc réécris la fonction en

void TextFlash(const char * message) {
  while(pgm_read_byte(message)) {
     Car(pgm_read_byte(message++));
  }
}

TextFlash(Menu_List[0]);

et la ça marche

merci

j'ai lu

ça va ouvre des horizons
merci

bravo ! :slight_smile:

Merci

en fait quand on a compris ça coule de source .. (de code source... :laughing:)

LOL - Au moins cette recherche ne vous a pas enlevé le sens de l'humour :slight_smile:

On attrape pas de maux a jouer avec ...

Encore merci.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.