class{ union{ struct{ wo liegt hier der Vorteil ?
-
das dürfte auch gar nicht kompilieren, oder? ich meine das zweite bsp.
union { int x; float y; char z; };
char ist nicht so groß wie float und int, das geht gar nciht. Da beginnen mömlich alle Variablen an der selben Stelle, wenn noch ne strut rum ist, dann beginnt die struct an der selben Stelle, wie vielleicht noch andere gleich große Structs
-
Maxi schrieb:
das dürfte auch gar nicht kompilieren, oder?
char ist nicht so groß wie float und int, das geht gar nciht.Na und? Sicher geht das.
-
Maxi schrieb:
das dürfte auch gar nicht kompilieren, oder? ich meine das zweite bsp.
char ist nicht so groß wie float und int, das geht gar nciht.für ein union wird immer soviel Speicher reserviert das sein größter Datentyp darin Platz findet. In diesem Fall wäre das größte Datenelement float.
koriegiere mich mal einer wenn ich mich da irren sollte
-
koriegiere mich mal einer wenn ich mich da irren sollte
Ok sizeof(int)==sizeof(float) mistens
Aber um auf 0x0000Fs Beispiel zurück zu kommen: die zwei Kodeschnippsel tun nicht das gleiche! Eine union einer struct is nicht gleich einer union der member der struct.
class Preis { public: union { struct { double y; char c; int anzahl; }; }; };
Ist das selbe wie:
class Preis { public: double y; char c; int anzahl; };
Eine union mit eimem member macht nie viel Sinn also nemme ich ein anderes Beispiel:
class S{ union{ struct{ char a1,b1,c1; double d1,e1; }; struct{ double a2,b2,c2; char d2,e2; }; }; };
Nun sieh dir mal die Offsets der Member an:
a1 0
b1 1
c1 2
d1 3
e1 11a2 0
b2 8
c2 16
d2 24
e2 25
Auch wenn der Standard diese Offsets nicht fordert sind sie aber sehr üblich. Hier ist sizeof(A)==26 Wenn du nun a1 mit a2,b1 mit b2,c1 mit c3,..., in jeweils eine union gepackt hättest dann würdest du unter dem Strich auf ein sizeof(A)==40 kommen weil du damit gefordert hättest, dass a1 mit a2, b1 mit b2,..., alligniert sind.
-
diese oben angedeutete schreibweise muss irgeneinen vorteil bringen, denn so sehen die matritzen in directx aus:
union{ struct{ float _11,_12,_13,_14; _21,_22,_23,_24, _31,_32,_33,_34, _41,_42,_43,_44, }; float m[4][4]; };
ich versteh nich genau, was das bringen soll, denn für die berechnung bringt die schreibweise keinerlei vorteile, da es soweit ich weis ja nich möglich ist, aus dem array der matrix so einfach in die float werte zu übertragen,und das array hat sonst auch keinerlei bedeutung.
aber eine frage: was würde passieren, wenn ich in der union das array gefüllt hab, ich aber auf die andren float werte zugreife?
-
gcc sagt dazu (aber nur mit -ansi -pedantic):
warning: ISO C++ prohibits anonymous structs
-
oops ganz vergessen, da is nochn typedef dum
typedef struct _D3DMATRIX {
-
Das hat ja nichts mit der anonymen Struktur zu tun.
-
Irgendwer schrieb:
koriegiere mich mal einer wenn ich mich da irren sollte
Ok sizeof(int)==sizeof(float) mistens
das hab ich ja garnicht behauptet, eher sowas
sizeof(deinUnion) == sizeof(größterDatentypImUnion) //beispiel: union { int a; float b; } test; sizeof(test) == sizeof(float);
-
union{ struct{ float _11,_12,_13,_14; _21,_22,_23,_24, _31,_32,_33,_34, _41,_42,_43,_44, }; float m[4][4]; };
Da die Struktur und die 4*4 Float-Matrix den gleichen Platz einnehmen, kannst du
über m[x][y] auf die member der Struktur zugreifen, das ist der Sinn davon.
-
Könnte man nicht auch einfach den []-Operator überladen?
-
hmm und wozu brauch man dann die einzelnen float werte selber? mithilfe des arrays sind sie doch "relativ" nutzlos...
-
Der Sinn ist mir nicht bekannt.
Und den []-Operator zu überladen wäre doch um einiges Aufwändiger als ne union
zu benutzen.
-
Die Union ist doch generell Blödsinn, weil ich über das 2d-Array auf die Werte zugreifen kann.
-
imho dient es wahrscheinlich nur der übersichtlichkeit für den programmierer, da er nämlich im kopf immer umrechnen müsste,wenn er einen wert der matrix abfragen will,falls er das array benutzt(matritzen fangen bei 1 an, arrays bei 0, das kann manchmal ne interessante fehlerquelle sein;))
-
otze schrieb:
imho dient es wahrscheinlich nur der übersichtlichkeit für den programmierer, da er nämlich im kopf immer umrechnen müsste,wenn er einen wert der matrix abfragen will,falls er das array benutzt(matritzen fangen bei 1 an, arrays bei 0, das kann manchmal ne interessante fehlerquelle sein;))
Ach quatsch. Wer so blöd ist und nicht umrechnen kann (bzw. eine Zugriffsfunktion schreiben kann die das "umrechnen" erledigt) sollte keine Matrizenoperationen von einem Programm erledigen lassen. Ich sehe jedenfalls keine Notwendigkeit für diesen zusammengehackten Mist. Kann höchstens sein, dass man bei Microsoft früher noch nicht so gute Debugger hatte und um in ein 2D-Array zu leuchten so rumhacken musste.
-
Hi,
der Grund ist denk ich ganz einfach, dass DirectX möglichst einfach zu bedienen sein sollen. Jetzt speichert aber jeder Programmierer die Matrizen am liebsten anders: Der eine als ein zweidimensionales Skalararray, der andere als ein eindimensionales Vektorarray und wieder ein anderer halt als einzelne Werte/Vektoren. Deswegen hat DirectX gleich zwei dieser Varianten von Haus aus drin, dem Compiler ist es ja egal wie man zugreift, die Adresse ist die gleiche.
Es ist halt nur eine Hilfe für den Programmierer.
ChrisM