Forum: Compiler & IDEs String-Arrays im Flash-Memory bei AVR-GCC?


von Robert K. (mc1)


Lesenswert?

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Vereinfachung_f.C3.BCr_Zeichenketten_.28Strings.29_im_Flash

zeigt wie man einfache Strings nur Flash verbrauchend ablegt und nutzt.
char StringImFlash[] PROGMEM = "Erwin Lindemann"; // im "Flash"

Ich schaff es jedoch nicht ein String Array abzulegen.

const char *aReg16Names[] PROGMEM = { "abc", "def", "ghi"};
..legt nur die Addressen ab, nicht die Strings o.ä.

const char aReg16Names[][] PROGMEM = { "abc", "def", "ghi"};
.. geht nicht

const char *aReg16Names[] PROGMEM = { PSTR("abc"), "def", "ghi"};
..: "error: braced-group within expression allowed only inside a 
function"

Wie könnte es gehen?


Robert

von Johannes M. (johnny-m)


Lesenswert?

> const char aReg16Names[][] PROGMEM = { "abc", "def", "ghi"};
> .. geht nicht
Bei einem zweidimensionalen Array muss mindestens die Spaltenzahl 
angegeben werden.
1
const char aReg16Names[][4] PROGMEM = { "abc", "def", "ghi"};
geht...

von Robert K. (mc1)


Lesenswert?

Johannes M. wrote:
>> const char aReg16Names[][] PROGMEM = { "abc", "def", "ghi"};
>> .. geht nicht
> Bei einem zweidimensionalen Array muss mindestens die Spaltenzahl
> angegeben werden.
>
>
1
> const char aReg16Names[][4] PROGMEM = { "abc", "def", "ghi"};
2
>
> geht...

Es soll kein rechteckiges 2D-Array werden, den die Strings im realen 
Case sind sehr unterschiedlich lang und viele.
Gibts noch eine andere Lösung für freie String-Arrays?

Robert

von Karl H. (kbuchegg)


Lesenswert?

Robert K. wrote:

> Es soll kein rechteckiges 2D-Array werden, den die Strings im realen
> Case sind sehr unterschiedlich lang und viele.
> Gibts noch eine andere Lösung für freie String-Arrays?
>
Sicherlich.
1
const char Str1[] PROGMEM = "String1";
2
const char Str2[] PROGMEM = "String2";
3
4
const char* Strings[] PROGMEM = { Str1, Str2 };

von Robert K. (mc1)


Lesenswert?

Karl heinz Buchegger wrote:
> Robert K. wrote:
>
>> Es soll kein rechteckiges 2D-Array werden, den die Strings im realen
>> Case sind sehr unterschiedlich lang und viele.
>> Gibts noch eine andere Lösung für freie String-Arrays?
>>
> Sicherlich.
>
>
1
> const char Str1[] PROGMEM = "String1";
2
> const char Str2[] PROGMEM = "String2";
3
> 
4
> const char* Strings[] PROGMEM = { Str1, Str2 };
5
>

Danke.  (Da die Tabellen eh von einem Py-Script automatisiert erzeugt 
werden, kann man mit den Hilfsnamen leben ...)

Grüsse
Robert

von technikus (Gast)


Lesenswert?

Hallo,

ich würde gerne die, wie von Karl Heinz angegebenen, Strings an die LCD 
Lib Funktion von Peter Fleury lcd_puts_p übergeben.

Kann ich dann einfach mit
1
lcd_puts_p(Strings[1]);

"String2" auf dem Display ausgeben ?

Danke und Gruß
technikus

von Karl H. (kbuchegg)


Lesenswert?

technikus schrieb:
> Hallo,
>
> ich würde gerne die, wie von Karl Heinz angegebenen, Strings an die LCD
> Lib Funktion von Peter Fleury lcd_puts_p übergeben.
>
> Kann ich dann einfach mit
>
>
1
> lcd_puts_p(Strings[1]);
2
>
>
> "String2" auf dem Display ausgeben ?

Nein kannst du nicht.
Weil Strings selber wieder ein Array ist (ein Array von Pointern) 
welches im Flash liegt. Und für jede Variable, die im Flash liegt, muss 
der Zugriff über die entsprechenden pgm_readxxx Funktionen gehen.

Allerdings muss das Strings Array ja auch nicht zwingend im Flash 
liegen.

von technikus (Gast)


Lesenswert?

Hallo,

das String Array würde ich gerne im Flash ablegen, da doch schon einige 
Texte zusammenkommen werfen.

Jetzt finde ich die pgm_read_word Funktion.

Wenn ich richtig verstehe, muss ich mir die Pointeradresse des 
gewünschten Strings aus dem Flash holen. Dann an das LCD übergben ?
1
    tempString = (const char*)( pgm_read_word( &(Strings[1]) ) );
2
                lcd_puts(tempString);

Passt das so?

Gruß

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

technikus schrieb:
> Passt das so?

Da tempString auch auch Adressen im Flash verweist, solltest Du 
lcd_puts_p verwenden.

von technikus (Gast)


Lesenswert?

Da ich schon 2 Jahre keinen AVR mehr programmiert habe, musste ich erst 
einmal AVR Studio 5 installieren und mein STK500 rauskramen.
Nach ein bißchen Auseinandersetzung mit dem AVR Studio 5 habe ich schon 
einiges weggetippt.


So läuft es:
1
//Beispiel zur Ausgabe im LCD
2
int i = 0; //bis i= StringArrayChannelSize...
3
4
lcd_puts_p((const char*)( pgm_read_word( &(strarray1[i]) ) ));
5
6
7
//oder
8
9
char temp[20];
10
11
//Stringarray Inhalt in temp Variable schreiben
12
strcpy_P(temp, (const char*(pgm_read_word((strarray1[i]) ) ) );
13
lcd_puts(temp);


DANKE!

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.