C String Literals aneinander hängen

Gast #4556684
Lesenswert?

Hi,
ich habe nen 32bit ARM µC und entwickle ein mehrsprachiges Menü.
Die Sprache soll zur Laufzeit wechselbar sein.

Mein Ansatz:
1
#define TEXT_MAXLEN 20
2

3
typedef enum {
4
  LANG_EN, LANG_DE, LANG_COUNT
5
} Language_t;
6

7
typedef enum {
8
  TXT_BASE, TXT_SETTINGS, TXT_COUNT
9
} Text_t;
10

11
const char txt[LANG_COUNT][TXT_COUNT][TEXT_MAXLEN] = {
12
  // LANG_EN
13
  { "Base", "Settings", },
14
  //LANG_DE
15
  { "Basis", "Einstellungen", }
16
  };

Das dürfte der gängige Ansatz sein den die meisten verwenden. Allerdings 
verschwende ich hier viel Flash-Speicherplatz wenn die Strings im 
Schnitt deutlich kürzer als die maximale Länge sind.

Daher meine Idee:
1
const char[] text = "Base\0Settings\0Basis\0Einstellungen";
2
const char* txt[LANG_COUNT][TXT_COUNT] = ... // Pointer auf den Anfang der Strings

Da ich für diesen Ansatz jedoch zur Compiletime die Pointer brauche bin 
ich mir relativ sicher, dass sich das nicht sauber umsetzen lässt.

Hat jemand eine Idee wie man sowas elegant hin bekommt oder geht das 
einfach nicht?

PS: Ja ich weiß dass ich genug Speicher habe und nicht sparen muss bei 
deim 32bit ARM, mich interessiert eher ob das generell geht.
#4556724
Lesenswert?

Nein, das Array wird immer LANG_COUNT  TXT_COUNT  größter String gross 
sein, egal wie lange die Strings darin sind. Glaube ich...

Es muss in der Art gemacht werden:
1
    const char text[] = "Base\0Settings\0Basis\0Einstellungen";
2
    int textLen = 20; // geraten, nicht gezählt
3
    int n = 1;
4
    // finde den n-ten String
5
    printf("%s",returnText(text,n,textLen));

Die Funktion returnText findet den n-ten String, die musst du halt 
schreiben.

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