Problem mit PGM_P Array[subscript]

Gast #76616
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----------*/
Gast #76617
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.