Forum: Compiler & IDEs C String Literals aneinander hängen


von Jan (Gast)


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.

von Clemens L. (c_l)


Lesenswert?

Einfach die Strings einzeln speichern. Das "const" für das Array selbst 
nicht vergessen:
1
const char * const txt[LANG_COUNT][TXT_COUNT] = {
2
  // LANG_EN
3
  { "Base", "Settings", },
4
  //LANG_DE
5
  { "Basis", "Einstellungen", }
6
};

: Bearbeitet durch User
von Jan (Gast)


Lesenswert?

Ahh danke.
Stimmt, das String Literal reserviert ja Speicher für sich, dh brauche 
ich die größe der Strings gar nicht anzugeben.

Danke
Gruß Jan

von Fritz G. (fritzg)


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.

: Bearbeitet durch User
von The D. (thedaz)


Lesenswert?

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

Falsch geglaubt. Es ist ein array mit pointern dessen Größe völlig 
unabhängig von den String-Längen ist.

von Fritz G. (fritzg)


Lesenswert?

Ich nehme alles zurück, Clemens hat recht. Weil es ja ein Array aus 
Pointern und nicht aus Strings ist.

: Bearbeitet durch User
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.