mikrocontroller.net

Forum: Compiler & IDEs Zugriff auf PROGMEM string-array


Autor: Stefan Seegel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.