Forum: Compiler & IDEs Zugriff auf PROGMEM string-array


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.