String-Array an Funktion übergeben

Gast #2545750
Lesenswert?

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 #2545774
Lesenswert?

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 #2545833
Lesenswert?

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
#2545849
Lesenswert?

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 #2546100
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren