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_gettext

    selbst 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..


Anmelden zum Antworten