Struktur mit Union initialisieren



  • TeaTime schrieb:

    Zu 2.: das ist mir bewusst.

    Bist du dir sicher, dass du verstanden hast, was SeppJ meinte?

    Entweder, du hast ein array von 16 floats oder einen einzelnen(!) float. Nicht 16 floats die auf den 16 Speicherstellen des arrays stehen. Desweiteren bin ich mir gerade nicht einmal sicher, ob du die Union nach Standard C++ so verwenden darfst.



  • Oh verdammt, ja stimmt da ist ja nur ein Float, jetzt verstehe ich was gemeint ist 😮.



  • Gut dann streich ich das einfach mit dem Union und überlade einfach den Operator.

    Vielen Dank!

    mfg


  • Mod

    Das ist doch sowieso reichlich sinnlos, wenn du immer m12 statt m[1][2] (oder m(1,2)) schreiben musst. Denn dann kannst du gar keine Variable als Index a la m(x,y) benutzen. Operatorüberladung und/oder ein kleiner Wrapper um das Array sind der bessere Weg.



  • Ja klar, so gesehen ist es das auch. Nur in der Mathematik heißen die Elemente so, deshalb konnte sich diese "Art" der Implementieren wohl halten, denn die Matrixen in XNA, SlimDX etc. werden tatsächlich so geschrieben. Ich glaub ich werde es einfach so lassen, is ja eigentlich egal ob man nun mat.m11 oder mat[0] schreibt, obwohl ich m11 aussagekräftiger halte, weils in der Mathematik halt so angegeben ist, aber das ist wohl Geschmackssache.



  • fuege doch einfach eine Funktion m(i,j) hinzu.



  • Das ist ja interessant in der DirectXMath API wird das tatsächlich so gemacht, wie ich es ursprünglich vorhatte.

    Hier die XMFLOAT4X4 union.

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

    http://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.reference.xmfloat4x4(v=vs.85).aspx

    Da is es halt einen Union, es kommt aber das gleiche raus.
    Über den Weg einer Struktur in der Union, so muss man das machen.



  • DirectX ist ja auch ein C-API.



  • DirectXMath ist eine C++-API.

    MS interessiert sich allerdings nur dafür, ob ihr Zeug mit Visual C++ läuft. Laut C++-Standard darf man bei so einer Union doch sowieso nur auf das zuletzt verwendete Feld zugreifen... also aus dem Array lesen, wenn man zuletzt ins Array geschrieben hat und aus dem struct, wenn man zuletzt dessen Member geschrieben hat. Kreuz und quer ist nicht erlaubt. Richtig?

    Mit VC++ funktioniert das also, mit anderen Compilern unter Umständen nicht. Falls das für OP relevant sein sollte.


  • Mod

    nicht ganz schrieb:

    Richtig?

    Richtig. Man sollte aber beachten, dass das eher eine Klausel ist, um bestimmte Sonderfälle (Alignmentprobleme, mit komplexen Datentypen fangen wir lieber gar nicht erst an) abzusichern. Wenn man sich halbwegs auskennt und keine Dummheiten macht, dann funktioniert das mit der Union so wie man erwartet, sogar ziemlich portabel - eher ist die Plattform das Problem als der Compiler. Und wenn man wie der Implementierer von DirectX davon ausgehen kann, dass eine bestimmte Zielplattform vorliegt, dann kann man sich sogar mit Sicherheit drauf verlassen. Insofern ist das schon in Ordnung, das hier so zu machen. Da die Feldgröße anscheinend statisch ist und nicht über das Reihen/Spalten iteriert werden muss, ist das sogar eine einigermaßen brauchbare Idee.


Anmelden zum Antworten