struct komplex
-
Hallo,
wie kann ich mittels einer globalen Variable Language auf die einzelnen Elemente dieser etwas komplexeren Struct zugreifen?
static unsigned char Language = 0x00; struct _Msg { const short ErrCode; const char *ShortDescript; }; struct _MsgLanguage { const struct _Msg ErrMsg_De; const struct _Msg ErrMsg_En; }; const struct _MsgLanguage ErrMsg[] = { {1, "DHCP_english: short description", 1, "DHCP_deutsch:", "kurze beschreibung"}, //etc, }; /* zugriff: */ ErrMsg[0].ErrMsg_En.ErrCode /* funktioniert, allerdings ist hier die Sprache durch ErrMsg_En bereits voreingestellt */ ErrMsg[0][Language].ErrCode //funktioniert nicht /* hier soll mittels Language ausgewählt werden ob man ErrMsg_En oder ErrMsg_De angezeigt bekommt -> das soll das Ziel sein */
Ich möchte gern mittels der globalen Variable Language auswählen können, ob ich die "kurze Beschreibung" oder / und den "ErrCode" in English oder in Deutsch erhalte.
Gruß
Hannes
-
hi,
bei deinem strukturaufbau hast du ziemlich viel redundanz, die strukturen sind quasi doppelt-gemoppelt. bei drei sprachen hättest du eine dreifachmoppelung, etc.der aufbau lässt sich vereinfachen, guckst du:
#include <stdio.h> unsigned lang_id = 0; struct Language { int ErrCode; char *ShortDescript; }; struct Languages { struct Language lang; // Einfachmoppelung, nicht redundant. }languages[2] = { { 1, "DHCP_english: short description" }, { 1, "DHCP_deutsch: kurze beschreibung" } }; int main() { printf ( "%d %s\n", languages[lang_id].lang.ErrCode, languages[lang_id].lang.ShortDescript ); lang_id = 1; printf ( "%d %s\n", languages[lang_id].lang.ErrCode, languages[lang_id].lang.ShortDescript ); return 0; }
-
danke für deine antwort, aber funktioniert das auch, wenn in dem Array mehrere Sachen drinnen stehen - wie z.B:
const struct _MsgLanguage ErrMsg[] = { {1, "DHCP_english: short description", 1, "DHCP_deutsch:", "kurze beschreibung"}, {2, "Test1_english: short description for test1", 2, "Test1_deutsch:", "kurze beschreibung für Test1"}, {3, "Test12_english: short description", 3, "Test12_deutsch:", "kurze beschreibung"}, };
Gruß
Hannes
-
ja, geht auch, spendierst du entsprechend viele instanzen und beachtest die initialisierungsreihenfolge:
#include <stdio.h> unsigned lang_id = 0; struct Msg { int ErrCode; char *ShortDescript; }; struct Languages { struct Msg msg[3]; // Mehrfachmoppelung, nicht redundant. }languages[] = { { 1, "eng 1", 2, "eng 2", 3, "eng 3" }, { 1, "de 1", 2, "de 2", 3, "de 3" }, { 1, "fr 1", 2, "fr 2", 3, "fr 3" }, }; int main() { int i; for ( i = 0; i < 3; i++ ) printf ("ErrCode: %d %s\n" , languages[lang_id].msg[i].ErrCode, languages[lang_id].msg[i].ShortDescript ); lang_id = 1; for ( i = 0; i < 3; i++ ) printf ("ErrCode: %d %s\n" , languages[lang_id].msg[i].ErrCode, languages[lang_id].msg[i].ShortDescript ); lang_id = 2; for ( i = 0; i < 3; i++ ) printf ("ErrCode: %d %s\n" , languages[lang_id].msg[i].ErrCode, languages[lang_id].msg[i].ShortDescript ); return 0; }
ist aber alles nicht wirklich schön und erst recht nicht wartungsfreundlich.
besser ist tabellen anzulegen, wie es gettext macht.
http://de.wikipedia.org/wiki/GNU_gettextselbst zu erstellen gar nicht schwer:
für jede sprache eine tabelle:MSGID MSGSTR
"error" "fehler"
dann rufst du nur noch puts ( my_message("error") );
auf.
je nach eingestellter sprache liefert die funktion
char* my_message(char* msgid);
die zugehörige übersetzung (msgstr). existiert keine übersetzung kann die
englische version angezeigt werden.
gruß,
a.
-
eine Frage hab ich noch bezüglich dieser Sache:
wie kann man auf die einzelen Elemente der Struct zugreifen, wenn der Zugriff nicht im gleichen c-file passieren soll?
Im Headerfile hab ich:
extern struct Languages languages[17];
Wenn ich es genauso schreibe bekomm ich eine Fehlermeldung:
"expression must be a pointer to a complete object type"for ( i = 0; i < 3; i++ ) printf ("ErrCode: %d %s\n" , languages[lang_id].msg[i].ErrCode, languages[lang_id].msg[i].ShortDescript );
Gruß
Hannes
-
Trenne die Definition von der Deklaration, pack die Deklaration in eine Headerdatei mit Includeguards, dann funzt das mit der exern - Anweisung..