Problem mit PGM_P Array[subscript]

Gast #76616
Lesenswert?

Wer kann dieses Rätsel lösen? Ich komm da nicht weiter (siehe vorletzte
Zeile). Das Programm ist kann so zum testen direkt kompiliert werden:

/*-------Start--------------*/
#include <stdio.h>
#include <avr/io.h>
#include <string.h>
#include <avr/pgmspace.h>

const char MenuPos1 [] PROGMEM = "Menupos 1";
const char MenuPos2 [] PROGMEM = "Menupos 2";

char *ch[] = { "test1", "text2" };

// Literale im ROM, Array im RAM
const char *Menu1 [2] PROGMEM = { MenuPos1, MenuPos2 };
// Literale im ROM, Array im ROM
PGM_P Menu2 [2] PROGMEM = { MenuPos3, MenuPos4 };

char Disp[17];

int main (void) {
  uint8_t i;

  i = 0;

  strcpy (Disp, ch[0]);    // funktioniert
  strcpy (Disp, ch[i]);    // funktioniert
  strcpy_P(Disp, Menu1[0]);  // funktioniert
  strcpy_P(Disp, Menu1[i]);  // funktioniert NICHT!!
}
/*-------------Ende----------*/
Gast #76617
Lesenswert?

Da das Menü selbst im ROM ist, mußt Du nicht nur die Strings, sondern
auch die Zeiger aus dem ROM lesen (prog_read_word() oder so ähnlich).

Daß die Variante mit konstantem Index dennoch funktioniert, ist eher
ein Artefakt der GCC-Optimierung.

Alternative: die Zeigertabelle selbst im RAM halten und nur die
Strings (die ja ungleich mehr Platz brauchen) in den ROM packen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren