AVR String-Array

Gast #2590073
Lesenswert?

Moinsens allerseits,

beim Aufräumen meines Programmcodes sollte auch ein String-Array 
(beinhaltet ein haufen an Strings) vom RAM in den Flash verbannt werden, 
was allerdings zu einigen Problemen führte.

Im RAM hat dieses Array folgende Gestalt:
1
static const char * sentence_Array[NSENTENCES][NLANGUAGES] = {
2
{"Willkommen", "Welcome"},
3
{"Satz1","Satz2"}
4
};

Um das Array in den Flash zu verschieben wird folgende Darstellung 
verwendet:
1
static const PGM_P sentence_Array[NSENTENCES][NLANGUAGES] PROGMEM = {
2
{"Willkommen", "Welcome"},
3
{"Satz1","Satz2"}
4
};
im LSS-File wird jedoch deutlich, dass der Compiler für jedes 
Array-Element nur einen Zeiger speichert (wie erwartet), welcher auf 
einen "Nichtverwendeten Bereich" im Flashspeicher zielt.
Die Strings an sich werden von Compiler in keiner Weise im Flash 
abgelegt.

Eine mögliche aber unkomfortable Lösung wäre jeden String einzelnd zu 
Deklarieren und die jeweilige Adresse im Array zu speichern:
1
const char T1[] PROGMEM = "Willkommen";
2
const char T2[] PROGMEM = "Welcome";
3
const char T3[] PROGMEM = "Satz1";
4
const char T4[] PROGMEM = "Satz2";
5
static const PGM_P sentence_Array[NSENTENCES][NLANGUAGES] PROGMEM = {
6
{T1, T2},
7
{T3, T4}
8
};

Gibts da eine bessere Möglichkeit, so dass man nicht erst jeden String 
einzelnden Deklarieren muss ???

Bin da für Ratschläge jeder Art offen;)

Gruß Thommy
Gast #2590305
Lesenswert?

@Uwe S.
sowas in der Art ging mir auch schon durch den Kopf, allerdings ist das 
ganze direkt in einer Tabelle übersichtlicher und schnell erweiterbar.

@Stephan
dies funktioniert leider nicht, da
1
# define PSTR(s) (__extension__({static char __c[] PROGMEM = (s); &__c[0];}))
aus 2 Codezeilen besteht, welche natürlich nicht im Array verwendet 
werden können.

Wahrscheinlich wirds drauf hinaußlaufen, dass ich die Strings in einer 
Excell-Datei verwalte und zum Erzeugen des Codes für die Strings ein 
kleines Skript verwende.

Aber Weiter Ideen oder Anregungen sind herzlich willkommen

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