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;