String-Array an Funktion übergeben

Gast #2545750
Hallo,

ich versuche seit geraumer Zeit, die Adresse eines String-Arrays und 
einen Index an eine Funktion zu übergeben und in dieser Funktion einen 
String aus dem Array auf einem LCD auszugeben. Die Strings und das Array 
befinden sich komplett im Flash. Zur Ausgabe des Strings verwende ich 
die Bibliothek von Peter Fleury.

Das habe ich bis jetzt:
1
const char eins[] PROGMEM = "Eins";
2
const char zwei[] PROGMEM = "Zwei";
3
const char drei[] PROGMEM = "Drei";
4

5
PGM_P str_array[] PROGMEM =
6
{
7
  eins,
8
  zwei,
9
  drei
10
};
11

12
void show_text_p(uint8_t x, uint8_t y, uint8_t index, PGM_P texte)
13
{
14
  lcd_gotoxy(x, y);
15
  lcd_puts_p(PGM_P)pgm_read_word(&(texte[index])));
16
}
Und der Aufruf dazu:
1
show_text_p(posx, posy, index, (const prog_char*) (&str_array));

Das läßt sich fehlerfrei kompilieren, liefert aber merkwürdige 
Ergebnisse, z.B. werden nicht alle Strings korrekt angezeigt. Wie 
übergibt man die Adresse eines sich im Flash befindlichen Arrays an eine 
Funktion und wie muß der Aufruf dazu aussehen?

Vielen Dank im Voraus.
Krause
Gast
const char eins[] PROGMEM = "Eins";
const char zwei[] PROGMEM = "Zwei";
const char drei[] PROGMEM = "Drei";

const char* str_array[] PROGMEM =
{
  eins,
  zwei,
  drei
};

void show_text_p(uint8_t x, uint8_t y, uint8_t index, char** texte);
oder
void show_text_p(uint8_t x, uint8_t y, uint8_t index, char texte[][]);
Gast
Diese Variante funktioniert:
1
void show_text_p(uint8_t x, uint8_t y, uint8_t index, char** texte);

Besser noch:
1
void show_text_p(uint8_t x, uint8_t y, uint8_t index, const char** texte);
Dann spart man sich das casten von const char** auf char**.


Danke für die schnelle Hilfe.
Krause
Krause schrieb:


> Besser noch:
>
1
> void show_text_p(uint8_t x, uint8_t y, uint8_t index, const char**
2
> texte);
3
>

Noch besser
1
void show_text_p(uint8_t x, uint8_t y, uint8_t index, const char*const* texte);

denn genau das ist es, was die Funktion bekommt:
Einen Pointer auf ein Array von Zeiger, die selbst const sind.
Und jeder Zeiger zeigt wieder auf ein Array von Charactern, die 
ebenfalls const sind.
Eben einen Pointer auf:
1
PGM_P str_array[] PROGMEM

(und da war auch der Hund in deiner Erstversion versteckt. Du hast 1 
Pointer zu wenig gehabt)
Gast
const char** könnte somit durch PGM_P* ersetzt werden. Wobei mir der 
Vorteil von PGM außer der kürzeren Schreibweise nicht ganz klar ist. 
Beim Aufruf kann man der Funktion auch ein RAM-Array übergeben, welches 
der Compiler klaglos akzeptiert, nur die Verarbeitung in der Funktion 
geht dann schief.

Wie dem auch sei, nochmals vielen Dank.
Krause

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 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.