Struktur mit Union initialisieren
-
Ganz vergessen, die Fehlermeldung
.IntelliSense: "class "sipgl::Mat4"" hat keinen Member ""Identity"". mat4.cpp 5 19 IntelliSense: Zu viele Initialisiererwerte. mat4.cpp 5 31
-
SeppJ schrieb:
1. Warum überhaupt eine Union?
2. Ich wette deine Union ist anders als du denkst. Deine Union enthält entweder ein float[16] oder einen von 16 verschiedenen einzelnen floats unter anderem Namen.
3. Was willst du überhaupt erreichen? Wenn es dir darum geht, einzelne Elemente eines Arrays über 2D-Koordinaten anzusprechen, dann gibt es wesentlich robustere Möglichkeiten dafür, ganz ohne die Sprache zu vergewaltigen.Zu 1.: damit man entweder mat.m[0] oder mat.m11 schreiben kann, also einfach nur damit man die Möglichkeit hat, den Namen der Stelle explizit anzugeben oder eben einfach nur über einen Index.
Zu 2.: das ist mir bewusst.
Zu 3.: siehe 1., man könnte dies auch über Operatorenüberladung [] machen, stimmt, vielleicht sollte ich es so machen
Aber wie würde es denn gehen?
-
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
-
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]; }; };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.
-
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.