Forum: Compiler & IDEs Zugriff auf PROGMEM string-array


von Stefan Seegel (Gast)


Lesenswert?

Hallo zusammen!

Ich habe ein Problem mit dem Zugriff auf meine Menütexte, die ich wie
in der FAQ beschrieben im Flash abgelegt habe:

const char SHOW0[] PROGMEM = "BRAUCHWASSER";
const char SHOW1[] PROGMEM = "HOLZKESSEL";
const char SHOW2[] PROGMEM = "PUFFERSPEICHER";
const char SHOW3[] PROGMEM = "OELKESSEL";
const char SHOW4[] PROGMEM = "HEIZUNG";
const char SHOW5[] PROGMEM = "UHRZEIT";
PGM_P SHOWMENU[6] PROGMEM = {SHOW0, SHOW1, SHOW2, SHOW3, SHOW4,
SHOW5};
Diese Strings möchte ich an ein Display schicken, z.B. so:

char buf[27];
strcpy_P (buf, SHOW[0]);
lcd_puts(buf);

Solange ich auf das array mit festen Zahlen zugreifen will (in dem
Beispiel 0) geht alles gut, aber wenn ich eine variable zur auswahl
hernehmen will:

char buf[27];
unsigned integer menu=0;
strcpy_P (buf, SHOW[menu]);
lcd_puts(buf);

zeigt das Display nur noch wilden Zeichensalat an. Was mache ich falsch
??!!

Vielen Dank schon mal im Vorraus für Hilfen !

Viele Grüße,
Stefan

P.S. Hat jemand Tips/Codebeispiele wie man eine Menuführung mit
Untermenüs prinzipiell macht ? Meinige funktioniert zwar, kommt mir
aber mächtig umständlich vor...

von Jörg Wunsch (Gast)


Lesenswert?

> Was mache ich falsch?

Nun, Du hast SHOWMENU[] selbst auch im Progmem, also mußt Du die
Pointer mit pgm_read_word() von da lesen:

const char *mytext;

mytext = (const char *)pgm_read_word(SHOWMENU + i);

Alternativ, laß SHOWMENU[] ganz normal im RAM liegen, so viel Platz
ist das ja nicht.

Bezeichner rein aus Großbuchstaben werden per Konvention eigentlich
für Präprozessor-Makros benutzt, für Variablen ist das nicht üblich.

Mit festen Indizes funktioniert es nur deshalb, weil die Adresse dort
bereits vom Compiler eingesetzt wird.

> Hat jemand Tips/Codebeispiele wie man eine Menuführung mit
> Untermenüs prinzipiell macht?

Sieh' Dir mal den Code zur AVR Butterfly (bzw. dessen GCC-Portierung
von Martin Thomas) an.  Ein bißchen umständlich ist sowas aber immer,
wenn man es generisch haben will.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.