Forum: Compiler & IDEs Problem mit PGM_P Array[subscript]


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 emax (Gast)


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----------*/

von Jörg Wunsch (Gast)


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.

von emax (Gast)


Lesenswert?

Danke für den Hinweis mit read_word, ich werde mal danach suchen.

Die Optimierung allerdings ist -O0 ...

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.