Zugriff auf PROGMEM string-array

Gast #100592
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...
Gast #100593
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.