Forum: Compiler & IDEs String-Array an Funktion übergeben


von Krause (Gast)


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

von mal probieren (Gast)


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[][]);

von Krause (Gast)


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

von mal probieren (Gast)


Lesenswert?

Bitte, bitte, gerne geschehen.

Du weist auch warum es so funktioniert?

von Karl H. (kbuchegg)


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)

von Krause (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.