Initialisierung von unions, die eine Struktur beinhalten



  • Hallo,
    ich will eine spezielle Union, die eine Struktur beinhaltet, initialisieren:

    union TestUnion
    {
    	uint			offset;
    	struct Handlers
    	{
    		GetHandler	get;
    		SetHandler	set;
    	}				handlers;
    };
    
    GetHandler get = NULL;
    SetHandler set = NULL;
    
    TestUnion test1 = { 0 };
    TestUnion test2 = { get, set };
    

    Bei test1 läuft's wunderbar. Leider geht das bei test2 nicht. Weiß jemand warum? (Ich benutze VC++ 6.0) Wie wäre die korrekte Initialisierung?

    Danke, Jan



  • Ich bin momentan sehr verwirrt, alles was ich ausprobiere lässt sich nicht compilieren.

    TestUnion test3 = { { get, set } };
    
    TestUnion::Handlers hndlrs = { get, set };
    
    TestUnion test4 = { hndlrs };
    
    TestUnion test5 = hndlrs;
    

    Natürlich klappt die Initialsierung von TestUnion::Handlers hndlrs, aber test3 bis test5 wollen nicht.



  • Und nochmals: Hallo

    Ich muss mich entschuldigen, ich habe das falsche Forum ausgesucht. Mit ANSI C ist dieses Vorgehen (Initialisierung mit Nicht-Konstanten) eh nicht möglich (das habe ich jetzt herausgefunden, nachdem ich meine datei von .cpp in .c umgenannt habe, nochmals sorry).

    Ich kann meinen Beitrag aber nicht verschieben (weiß nicht, ob es möglich wäre, wenn ich angemeldet gewesen wäre). Vlt weiß ja trotzdem jemand was.

    (PS: habe mich jetzt sogar angemeldet)



  • Ich glaube ausser deiner test4 Variante bleibt nicht viel anderes

    TestUnion::Handlers hndlrs = { NULL, NULL };
    TestUnion test4 = { hndlrs };
    

    ps: warte, bis ein Mod Dich verschiebt



  • Ehm, leider geht test4 auch nicht.

    JnGrb schrieb:

    test3 bis test5 wollen nicht.

    Aber ich weiß jetzt warum:

    MSDN Library schrieb:

    When a union is initialized, initializer-list must be a single constant expression. The value of the constant expression is assigned to the first member of the union.

    Man kann also nur das erste Element einer Union initialisieren. Aber eigentlich müsste der Compiler doch am Typ erkennen können, welches Element er initialisieren soll 😕

    Da ich ja in C++ code, werde ich mir wohl eine Lösung mit Konstruktoren überlegen müssen, obwohl ich das eigentlich vermeiden wollte. Union haben zwar keine Konstruktoren, aber meine Struktur sieht im Original auch so aus:

    struct {
     union {
      struct {
      }
     }
    }
    

    Also bekommt die äußere Struktur wohl oder übel einen Konstruktor.

    Gruß, Jan



  • Sry, hab ich überlesen.
    Wenn du die hndlrs Struktur, die du übergibst const setzt gehts auch nicht?



  • 1310-Logik schrieb:

    Wenn du die hndlrs Struktur, die du übergibst const setzt gehts auch nicht?

    Nope, wie ich jetzt weiß, greift die Initialisierung immer nur für das erste Mitglied der Union (in diesem Fall: uint offset). Es gibt anscheinend keine Möglichkeit den Wert anderer Mitglieder (wie meine struct Handlers handlers) über initializer-lists ({ ... }) zu bestimmen.

    Da struct Handler ja doppelt so groß ist wie uint offset, kann ich es auch nicht irgenwie verpacken. Beispiel:

    union UNION
    {
      int i;
      float f;
    };
    
    const float cf = 0.1f;
    
    union UNION u = { *(int *)&cf };
    

    ⚠ Das ist dann aber auch sehr ekliger Code!



  • JnGrb schrieb:

    union UNION u = { *(int *)&cf };
    

    Das ist dann aber auch sehr ekliger Code!

    schreib's doch so:

    union UNION u;
       u.f = 0.1f;
    

Log in to reply