struct Array



  • Hi there,

    unsigned char Language = 1;   //English
    
    struct _MsgLanguage {
    	struct _Msg German;
     	struct _Msg English; 
    	struct _Msg Spanish;
    
    };
    
    struct _MsgLanguage *pmsg = (struct _MsgLanguage *)0;
    
    /* möglicher zugriff */
    pmsg->German.ErrAvail = 0x00;
    

    Gibt es die Möglichkeit, dass man über eine globale Variable (Language) die Sprache bei einem Zugriff (wie oben) ohne if-Abfrage etc. sofort richtig hat?

    ähnlich wie dieser schematische (nicht richtige) Zugriff es zeigen würde

    pmsg->Language.ErrAvail = 0x00;
    

    Gruß
    Gerd



  • Hi,
    über nen Index und nem Cast nach DefaultLanguage sollte das funzen.
    Allerdings müssen die Member der Structs bis zum letzten Member auf den zugegriffen wird, identisch sein.



  • struct Msg
    {
    	int msg_id;
    	char msg[256];
    };
    
    struct Messages
    {
    	struct Msg German;
    	struct Msg English;
    }msgs = 
    {
    	{0, "German message"},
    	{1, "English message"}
    };
    
    struct Msg* pmsg;
    int msg_index = 1;
    
    void view_msg ( unsigned index )
    {
    	if (index > msg_index)
    		return;
    	printf("%s\n", (pmsg+index)->msg );
    }
    
    int main() 
    {   
    	pmsg = &msgs.German;
    	view_msg ( msg_index );
    	return 0;
    }
    

    Vorsicht vor Füllbytes! 😃
    Mit #pragma pack(1) sollte das funzen.
    Nur der Zugriff über die Namen der Member ist sicher. Sei nicht so faul und mach ne switch-case abfrage für jede Sprache, bisser ist das. 😉



  • Switch wäre eine gute Idee, auch ein richtiges Array wäre gut:

    #define GERNMAN 0
    #define ENGLISH 1
    /* ... */
    
    struct language {
        int ErrAvail;
        /* ... */
    } pmsg[] = {
        {42 /* , ... */},    /* German */
        {43 /* , ... */},    /* English */
        /* ... */
    }
    
    unsigned char Language = 1;   //English
    
    /* möglicher zugriff */
    pmsg[GERMAN].ErrAvail = 0x00;
    


  • eine sichere index variante ist mit nem struct xyz** pxyz;
    pxyz[irgend_ein_index].irgendwas = was_auch_immer;


Anmelden zum Antworten