Union



  • union Vector3D
    {
    	struct {
    		float x;
    		float y;
    		float z;
    	};
    	float v[3];
    
    	void print()
    	{
    		cout<<x<<endl;
    		cout<<y<<endl;
    		cout<<z<<endl;
    	}
    };
    

    ist das schöner Code? wie man sieht greift die print Funktion immer auf die Datenelemente x, y, z zu - diese existieren aber doch nicht wenn man ein Vektor wie folgt konstruiert:

    v.v[0] = 9;
    v.v[1] = 7;
    v.v[2] = 8;
    
    v.print();
    

    komischer Weiße werden mir die gleichen Werte ausgegeben... liegt mein Compiler das intern zusammen? ist das Standardkonform? oder ist das nur ein netter Hack?

    Was sagt ihr zu folgendem:

    typedef struct _D3DMATRIX {
        union {
            struct {
                float        _11, _12, _13, _14;
                float        _21, _22, _23, _24;
                float        _31, _32, _33, _34;
                float        _41, _42, _43, _44;
    
            };
            float m[4][4];
        };
    } D3DMATRIX;
    


  • ist das schöner Code?

    NEIN!
    Member-Funktionen in einer Union *brrr*

    Erstelle dir gefälligst eine Klasse und überlade den << - Operator von cout dafür.
    So wie alle anderen auch 😉



  • es geht mir um den direken Zugriff auf die Datenelemente x, y, z

    existieren diese überhaupt? - eigentlich nicht - aber irgendwie schon...

    In meinem schlauem Buch steht: "Union entspricht einem Summendatentyp, der zwei oder mehr Elemente definieren kann, die sich gegenseitig ausschließen"

    d. h. doch:
    entweder es gibt x, y, z
    ODER
    es gibt das Array v[3]

    aber nicht beides gleichzeitig...



  • das ist doch kein C++ was du da machst 😮

    das ist wohl das eindeutigste Zeichen, dass das eher C ist:
    [quote]

    typedef struct _D3DMATRIX { [...]
    } D3DMATRIX;
    

    [/code]

    komischer Weiße werden mir die gleichen Werte ausgegeben... liegt mein Compiler das intern zusammen? ist das Standardkonform? oder ist das nur ein netter Hack?

    union arbeitet auf dem gleichen Speicher.

    Aber ansonsten ist der Code komplett hässlich und unübersichtlich. Memberfunktionen in der union, Namen wie _11 und co.

    Naja, erst Direct3D gemacht und dann mit C++ angefangen?


  • Mod

    Vertexwahn schrieb:

    ist das Standardkonform? oder ist das nur ein netter Hack?

    das ist korrekter code. trotzdem umständlich und unmotiviert. of du nun über v[...] oder x,y,z auf die daten zugreifst, ändert ja nichts an den daten, sondern nur, wie diese daten interpretiert werden. da die interne repräsentation von 3 aufeinanderfolgenden floats mit der eines arrays aus 3 floats identisch ist, kannst du auf beide weisen zugreifen und erhälst jedesmal dasselbe ergebnis. interessanter und nützlicher sind unions, wenn tatsächlich echt verschiedene typen gespeichert werden sollen. in diesem sinne ist die aussage im buch zu verstehen, beispiel:

    union foobar
    {
        float foo;
        double bar;
    };
    

    wenn du jetzt irgendetwas in bar schreibst, so ist der inhalt von foo im prinzip unbestimmt (abhängig eben von der interen repräsentation beider typen), nachdem du bar geschrieben hast, ist der wert in foo sozusagen sinnlos, bzw. nicht existent. schreibst du jetzt in foo, so ändert sich auch bar (quasi unverhersehbar), da beide denselben speicher beanspruchen; es ist also praktisch verloren, das bedeutet aber nicht, dass du nicht trotzdem darauf (also den sinnlosen inhalt) zugreifen könntest.



  • "of du nun über v[...] oder x,y,z auf die daten zugreifst, ändert ja nichts an den daten, sondern nur, wie diese daten interpretiert werden. da die interne repräsentation von 3 aufeinanderfolgenden floats mit der eines arrays aus 3 floats identisch ist, kannst du auf beide weisen zugreifen und erhälst jedesmal dasselbe ergebnis."

    Genau das hat in meinem Buch gefehlt und den Tutorials, die ich gelesen habe -
    Danke!



  • Hallo,

    Member-Funktionen in einer Union *brrr*

    Aber ansonsten ist der Code komplett hässlich und unübersichtlich. Memberfunktionen in der union

    was habt ihr denn bitte für ein Problem mit Memberfunktionen in einer Union?

    das ist korrekter code

    Das kommt auf die Definition von "korrekt" an. Wenn korrekt für "standardkonform" steht (was in diesem Forum sinn macht), dann ist deine Aussage käse, denn der Code ist unter dieser Annahme nicht korrekt.

    1. Ergibt die Deklaration einer unbenannten Struct ohne die gleichzeitige Definition eines Objekts aus Sicht von Standard-C++ überhaupt keinen Sinn. Du kannst von einer solchen Struct nachträglich kein Objekt anlegen, da du ja keinen Namen hast.
    Also das macht Sinn:

    struct {...} einObjekt;
    

    Und das

    struct {...};
    

    ist genauso sinnvoll wie das:

    // leer
    

    2. Der Zugriff auf x, y, z innerhalb von print() ist kein legal C++. x, y, und z sind in diesem Kontext nicht deklariert.

    3. Der Zugriff auf ein nicht aktives Element einer Union führt in Standard-C++ zu undefiniertem Verhalten, ist also ebenfalls kein legales C++ (es gibt eine Ausnahme, die hier aber keine Rolle spielt).

    Kurz:

    ist das Standardkonform? oder ist das nur ein netter Hack?

    Beide Unions sind nicht standardkonform. Das das Funktioniert ist kein Hack sondern eine (proprietäre) Erweiterung deines Compilers.



  • typedef struct _D3DMATRIX { 
        union Matrix44 { 
            struct Variante1 { 
                float        _11, _12, _13, _14; 
                float        _21, _22, _23, _24; 
                float        _31, _32, _33, _34; 
                float        _41, _42, _43, _44; 
    
            }; 
            float Variante2[4][4]; 
        }; 
    } D3DMATRIX;
    

    ist es jetzt Standardkonform?

    union Vector3D 
    { 
        struct Variante1{ 
            float x; 
            float y; 
            float z; 
        }; 
        float Variante2[3]; 
    
    };
    


  • D3DMATRIX besitzt jetzt gar keine Member, nur Typen. Und in Vector3D wirst du auch nicht auf x, y, z zugreifen können.
    Wieso definierst du deine Member nicht normal, ohne union, und überlädst den op[]?


Anmelden zum Antworten