ein Kapitel zurück                                           ein Kapitel weiter

Ein weitere Möglichkeit Daten zu Strukturieren sind sogenannte Unions. Abgesehen von einem anderem Schlüsselwort bestehen zwischen Unions und Strukturen keine syntaktischen Unterschiede. Der Unterschied liegt an der Art wie mit dem Speicherplatz der Daten umgegangen wird.

Hierzu möchte ich Ihnen nochmals erst die Speicherplatzbelegung einer Struktur zeigen. z.B....

struct test {
                 char a;
                 int b;
                 double c;
                }text;

Dies Struktur besitzt 13 Bytes. Jetzt mal abgesehen vom Alignment, wollen wir nicht ganz so genau sein, da es normalerweise 16 Bytes währen. Wir tun einfach so, als ob wir das Attribut "packed" verwenden. Hierzu unsere Struktur bildlich....

unions


So kann man sich die Struktur intern vorstellen.

Jetzt sehen wir uns das ganze mit dem Schlüsselwort union an....

union test {
                 char a;
                 int b;
                 double c;
                }text;;

...dies würde dann intern so aussehen....

unions


Auch hier soll jede einzelne Spalte ein Byte darstellen. Aber warum haben wir hier nur 8 Bytes? Nun das liegt daran das das größte Element in der Union von Typ double ist. Aber.... sie können bei einer Union immer nur auf ein Element Zugreifen bzw. speichern. Nehmen wir z.B an sie übergeben an int b den Wert 100 mittels...

text.b=100;

Somit ist die Speichergröße Ihrer Union 2 Bytes für einen Integer-Wert groß. Wenn sie jetzt z.B. an double c den Wert 10.55 übergeben....

text.c=10.55;

Hiermit hat unsere Union eine Größe von 8 Bytes. Nun können sie aber nicht mehr auf den Wert von int b zugreifen da dieser von double c verdeckt wurde. Es kann natürlich schon sein das falls sie darauf zugreifen, auf int b meine ich, das immer noch der Wert 100 ausgegeben wird aber das ist dann Zufall da durch double c der Wert von int b überlappt wurde. Und jetzt fragen sie sich was das dann bringen soll wenn man immer nur auf ein Element von einem bestimmten Typ zugreifen kann?

Nun hauptsächlich liegt die Anwendung von Unions zum Einsparen von Speicherplatz bei Verarbeitung von Großen Strukturen, wenn z.B. bestimmte Elemente niemals miteinander auftreten.

Nun ein Beispiel dazu. Nehmen wir mal an sie wollen ein Kampfspiel programmieren. Falls sie übrigens vorhaben später mal Spiele zu programmieren sind Strukturen wesentliche Elemente dazu. Also in dem Spiel wollen sie das immer nur Einer gegen Einen kämpfen. Aber sie Entwickeln etwa 4 verschiedene Gegnercharaktere. Dann würden wir das kurz und grob ohne viel SchnickSchnack z.B. so schreiben...

struct gegner{
              union{
                     struct{
                              char name[20];
                              int power;
                              unsigned char leben;
                              unsigned int geschwindigkeit;
                            }fighter1;
                     struct{
                               char name[20];
                               int power;
                               unsigned char leben;
                               unsigned int geschwindigkeit;
                             }fighter2;
                     struct{
                                char name[20];
                                int power;
                                unsigned char leben;
                                unsigned int geschwindigkeit;
                              }fighter3;
                      struct{
                                 char name[20];
                                 int power;
                                 unsigned char leben;
                                 unsigned int geschwindigkeit;
                               }fighter4;
                        };
               }dat;

Somit können sie immer nur auf eine Struktur zugreifen. Was in diesem Beispiel auch reicht, denn wir wollen ja immer nur die Daten von einem Kämpfer im Speicher haben und nicht von allen. Nehmen wir an sie wollen dem 'fighter3' einen Namen geben....

strcpy(dat.fighter4.name,"HULK");
dat.fighter4.power=5;

Hier sehen sie auch das die Schreibweise zur Übergabe eines Wertes die selbe ist wie bei den Strukturen. Nur können sie halt nur eine Struktur benutzen. Um zu unseren Adressverwaltung zurückzukommen. Denn die eignet sich prima für eine Union.....

struct adres {
              union{
                   struct{
                             char vname[20];
                             char nname[20];
                             long PLZ;
                             char ort[20];
                             int geburtsjahr;
                            }privat;
                   struct{
                             char vname[20];
                             char nname[20];
                             long PLZ;
                             char ort[20];
                             int geburtsjahr;
                            }geschaeftlich;
                    };
         }adressen[100];

Hier können sie 100 Adressen eingeben entweder Privat oder Geschäftlich. Ich belasse es hiermit erstmals mit den Unions den ich denke das das Thema nicht allzu schwer sein dürfte da es im Prinzip ja nichts anderes wie Strukturen sind. Sie sollten nun den Sinn und Zweck von Unions kennen. Es gibt da zwar auch noch ein anderes Anwendungsgebiet der Unions mit Systemnahen Einsatz aber dazu will ich etwas später wenn es Sinnvoller erscheint kommen.

Sollten sie vorhaben Ihre Programme auf andere System zu portieren, so müssen sie sich 100%-ig mit dem Alignment diverser Systeme auskennen, sofern sie unions einsetzen wollen. Ansonsten dürften sie Probleme mit der Portierung bekommen. Zu diesem Thema habe ich ein extra Kapitel eingerichtet.

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf