Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Unterschied zwischen struct und union?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
18.08.2005, 23:07 Uhr
~Ocular
Gast


Ich hab ne definition von beidem, aber ich kappiere die Erklärung nicht.
Es heißt union kann genau ein Element abspeichern, was bedeutet das? Kann struct mehrere?
Oder bezieht sich das auf Arrays innerhalb von structs?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.08.2005, 23:26 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


eine union ist quasi ein datentyp der sich "wandeln" kann. er kann also z.B. als int oder als double interpretiert werden, je nachdem wie man es gerade haben will. von der grösse im speicher her nimmt er logischer weise soviel ein wie der grösste datentyp innerhalb der union...

ein struct ist mehr oder weniger nichts anderes als ein klasse... du packst mehrere eigenschaften/variablen unter einem neuen namen zusammen...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.08.2005, 23:41 Uhr
~Ocular
Gast


Das verstehe ich nicht ganz, das dämliche Buch zeigt mir den Unterschied nicht.
Union wird doch genauso deklariert wie struct, es wird genauso initialisiert und kann wird genauso behandelt.
Kann mir das jemand n wenig genauer erklären? Es war mir nicht ersichtlich, dass union überhaupt als etwas anderes als union interpretiert werden kann und ich verstehe auch nicht wie, weil die Benutzung analog zu struct läuft
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.08.2005, 23:58 Uhr
Pablo
Supertux
(Operator)


Du kannst dir vorstellen, dass eine Union ein besonderer struct ist. Bei einem Struct wie bei einer Union kann man viele Member haben, die unterschiedliche Länge haben (hiermit ist die Anzahl der bytes gemeint, die gebraucht werden, um die Datentypen darzustellen, z.b. 4 für int, 8 für double, usw).

Schauen uns wir ein Bsp an:


C++:
#include <iostream>

struct mystruct
{
        int a;
        double b;
};

int main(void)
{
        std::cout << "Ein `mystruct` Objekt benötigt " << sizeof(mystruct) << " Bytes für die Darstellung" << std::endl;
        mystruct x;
        x.a = 10;
        x.b = 1000.0/3.0;
        std::cout << "x.a = " << x.a << "; x.b = " << x.b << std::endl;
        return 0;
}



Die Ausgabe ist:

Code:
Ein `mystruct` Objekt benötigt 12 Bytes für die Darstellung
x.a = 10; x.b = 333.333



Ein `mystruct` Objekt benötigt 12 Bytes. 4 Bytes wegen dem int (a) und 8 mehr wegen dem double (b). D.h. der Speicher des structs ist sozusagen eine Aneinanderreihung von einem int und einem double. Nun was passiert, wenn ich jetzt union statt struct benutze?


C++:
#include <iostream>

union mystruct
{
        int a;
        double b;
};

int main(void)
{
        std::cout << "Ein `mystruct` Objekt benötigt " << sizeof(mystruct) << " Bytes für die Darstellung" << std::endl;
        mystruct x;
        x.a = 10;
        x.b = 1000.0/3.0;
        std::cout << "x.a = " << x.a << "; x.b = " << x.b << std::endl;
        return 0;
}



Die Ausgabe ist:

Code:
Ein `mystruct` Objekt benötigt 8 Bytes für die Darstellung
x.a = 1431655765; x.b = 333.333



Jetzt wird nur 8 Bytes benötigt, also so viel wie das Member, das am meisten braucht, in dem Fall das double b. Aber ich kann die Members nicht mehr gleichzeitig benutzen, denn statt 2 "Speicherfelder" gibt es nur eine und alle Members von der Union teilen sich den gleichen Speicher. Deswegen wird so viel benötigt, wie das größte Member. Das ist keine Aneinanderreihung mehr von int und double. Aber x kann als int oder double benutzt werden, je nachdem auf welches Member man zugreift. Macht man x.a dann wird der Speicher als der von einem "int" interpretiert. Macht man x.b dann wird der Speicher als der von einem "double" interpretiert. Ich hoffe, so ist dir klarer geworden.

edit:

graphisch könnte man sich so vorstellen:


Code:
Bei dem struct

4 bytes int(a)               8 bytes double(b)
^_______________ __________________________________
|_______________|__________________________________|



Bei der union

       8 bytes int/double (a und b)
^__________________________________
|__________________________________|




PS: Beachte, dass die Größeangabe (4,8 Bytes) von der Rechnerarchitektur abhängen, hier am Bsp meines Intel P3.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 19.08.2005 um 00:06 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
19.08.2005, 09:08 Uhr
~Ocular
Gast


Hi
danke ist karer geworden, nur verstehe ich nicht, warum in deinem Fall trotz x.a= 10;

x.a => 1431655765

Oder ist der Grund, weil ja x.a auch soviel Speicher kriegt, wie ein double, dass ein Wert aus den 8 bytes genommen wird?

Wenn ja, wie kann ich dann x.a als int benutzen? Mit typecasting?
Und damit wäre diser Satz für mich noch nicht geklärt, der bei mir im Buch steht

Zitat:

union kann genau ein Element abspeichern

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
19.08.2005, 09:44 Uhr
Tommix



Hallo,
Du kannst entweder x.a oder x.b benutzen (also genau eines davon gleichzeitig), da beide den gleichen Speicher belegen, wie Pablo schon schrieb. D.h. in dem Moment, wo Du x.b beschreibst, ist x.a futsch und umgekehrt.

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
19.08.2005, 10:07 Uhr
~Ocular
Gast


Achso!

jetzt hab ich es kappiert.
Ich hätte es schneller kappiert, wenn man oben angemerkt hätte, dass der Wert von x.a nun zufällig ist

Danke an alle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
19.08.2005, 10:55 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

Ich hätte es schneller kappiert, wenn man oben angemerkt hätte, dass der Wert von x.a nun zufällig ist


Der Wert ist nicht zufällig sondern genau der Wert den du zugewiesen hast...

Die Sache ist z.B. einfach so... stell dir vor im Speicher steht z.B. 01011010... wenn du dieses nun als char ausgeben lässt wird das halt anders interpretiert als wenn du daraus ne flieskommatypen oder was auch immer machen würdest. Die interne darstellung im speicher ist für alle datentypen der union gleich. wenn du diese für x.b änderst wird natürlich das was für x.a dann interpretiert wird auch geändert hat aber in keinster weise was mit zufall zu tun...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
19.08.2005, 11:58 Uhr
Pablo
Supertux
(Operator)



Zitat von ~Ocular:
Achso!

jetzt hab ich es kappiert.
Ich hätte es schneller kappiert, wenn man oben angemerkt hätte, dass der Wert von x.a nun zufällig ist

Danke an alle

nein, das ist es nicht. Wie du an meiner "graphischen" Darstellung sehen kannst, belegen x.a und x.b den selben Speicher, d.h. wenn du x.a=10; machst, dann weißt du die 10 in diesen Speicher zu. 10 ist in Binär
0000 0000 0000 0000 0000 0000 0000 1010 und genau das wird in der Union gespeichert. Wenn du aber nun x.b liest, dann liest genau diese Bitfolge, aber weil x.b ein double ist, dann wird diese Bitfolge nicht als eine Zahl im 2er Komplement sondern als Fließkommazahle (ich will jetzt nicht genau ausrechnen, weil ich die Werte für die Mantisse zur Zeit nicht mehr kenne).

Dasselbe passiert wenn man macht x.a = 10; x.b = 1000.0/3.0;
zwar weist du der Union den Wert 10 zu aber gleich wird er von x.b = 1.... überschrieben und dieser Wert als Fließkommazahl. Wenn du x.a liest, dann liest 1431655765 und das liegt daran, dass die Zahl 333,33 so als 1431655765 in 2er Komplement Darstellung gelesen wird.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
19.08.2005, 12:06 Uhr
~Ocular
Gast


So, jetzt hab ichs, dann macht die Erklärung auch nen Sinn,

noch mals danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: