JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=f7437099f1179ade253264bf30c9f40cMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Unions vs. Strukturen

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Fruchteis
Mini JLI'ler



Anmeldedatum: 15.09.2007
Beiträge: 27
Wohnort: Heidelberg
Medaillen: Keine

BeitragVerfasst am: 18.01.2008, 00:45    Titel: Unions vs. Strukturen Antworten mit Zitat

Wollte nur einmal in Erfahrung bringen, ob jemand unions den Strukturen vorzieht, geschweige denn sie überhaupt benutzt?
_________________
Ein Beweis für Programmierer:
Jedes Programm läßt sich um mindestens eine Anweisung kürzen.
Jedes Programm hat mindestens einen Fehler.
Durch Induktion können wir schließen:
Jedes Programm ist reduzierbar auf eine Anweisung, die nicht funktioniert...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 18.01.2008, 09:15    Titel: Re: Unions vs. Strukturen Antworten mit Zitat

Fruchteis hat Folgendes geschrieben:
Wollte nur einmal in Erfahrung bringen, ob jemand unions den Strukturen vorzieht, geschweige denn sie überhaupt benutzt?


Ja, habe ich früher oft benutzt, aber inzwischen sind die Compiler so schlau, dass es wenig Sinn macht, sich noch mit ihnen rumzuärgern.
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
GreveN
JLI Master


Alter: 37
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 18.01.2008, 12:06    Titel: Antworten mit Zitat

Wie vorziehen? Unions und Strukturen sind etwas komplett Verschiedenes...

Strukturen(-Instanzen) sind quasi eine Komposition verschiedenen andere Objekte, eine Union zwar auch, allerdings teilen diese sich den selben Speicher. Das bedeutet, die Union reserviert ausreichend Speicher für das größte Objekt (natürlich am ggf. Prozessor-Alignment ausgerichtet), aber alle Objekte liegen in diesem Speicher und überschreiben ihn natürlich wenn man ihnen Werte zuweist.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 18.01.2008, 16:30    Titel: Antworten mit Zitat

Strukturen kann man einfache (von C geerbt) als einfache Ansammlungen von Variablen bezeichnen. Mit C++ können Strukturen natürlich noch weitaus mehr, z.B. Access-Segmentierung (private, public...), Vererbung, Methoden, Operatoren etc., also das was eine Klasse auch kann. Unions benutzen, wie GreveN gesagt hat, denselben Speicher für jedes Element. Davon kann man sich ganz elegant Nutzen machen, hier 2 kleine Beispiele:
CPP:
// ein 32-bit Color Union, das sowohl die einzelnen Komponenten als auch
// ein 32-bit Wert mit der Farbe enthält
union Color
{
     struct { unsigned char a, r, g, b; };
     unsigned long col;
};

// ein Vektor mit sowohl x,y,z-Zugriff, als auch Array-Zugrif (geht auch als Template)
union Vector
{
     struct { float x, y, z; };
     float values[3];
};
Seit c++ können sogar Unions alle Elemente einer Klasse definieren, s.o. bei struct. Im Grunde sind alles "Strukturen" nur mit mehr oder weniger großen untersch. Eigenschaften.

Willst du aber Unions benutzen, um Platz zu sparen, ist das der falsche Weg. Dazu kannst du Member-Indexing nutzen, z.B:
CPP:
struct Foo
{
     int ivar : 4;
     bool b1 : 1;
     bool b2 : 1;
     char cvar : 2;
};
Hierbei ist (norm.) sizeof Foo == 1, d.h. alle Variablen werden in einem Byte untergebracht. Im Byte-Modell sieht das so aus:
Code:

C C B B I I I I; // C -> 2 bit für cvar, B -> 1 bit für jeweils b1 und b2, I -> 4 bit für ivar


Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 36
Anmeldedatum: 17.02.2003
Beiträge: 3431
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 18.01.2008, 17:12    Titel: Antworten mit Zitat

@DirectXer
Krass, das kannte ich noch gar nicht Very Happy


Unions habe ich bis jetzt auch nur genutzt, um z.B. in einer Vectorklasse die einzelnen Zahlen unter mehreren Namen ansprechen zu können. Ansonsten eigentlich noch nie.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
GreveN
JLI Master


Alter: 37
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 18.01.2008, 18:36    Titel: Antworten mit Zitat

Nargh, das hatte ich aber schon paar mal erwähnt, wobei ich davon heute gar nicht mehr so angetan bin, weil ich mir nicht sicher bin, ob die einzelnen Objekte einer Struktur zwingend in der Reihenfolge im Speicher liegen in der sie im Code aufgeführt werden. Soll heißen, wenn man z.B. in einer namenlosen Struktur innerhalb der Union "unsigned char r, g, b, a;" stehen hat, könnte ich mir durchaus vorstellen, dass die r-Komponente nicht zwingend im ersten Byte stehen muss.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
Deviloper
Junior JLI'ler



Anmeldedatum: 31.05.2006
Beiträge: 77

Medaillen: Keine

BeitragVerfasst am: 18.01.2008, 18:42    Titel: Antworten mit Zitat

doch normal sollte das schon so sein. Weshalb man auch auf die Reihenfolge acht geben sollte. (wenn sizeof usw. von nöten sind).
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 19.01.2008, 00:00    Titel: Antworten mit Zitat

@GreveN: Jo ich hab das von dir schon mal so gelesen. Aber da dus net gesagt hast hab ich das mal gemacht Razz Aber das mit der Reihenfolge ist laut C++ Standard festgelegt, du solltest es aber im Zweifelsfall trotzdem so machen:
CPP:
unsigned char a;
unsigned char r;
unsigned char g;
unsigned char b;
Dann ist es eindeutig(auch für menschliche Leser).

@Jona: Ja man lernt nie aus ne Very Happy Ich war auch fasziniert als ich das das erste mal bei boost so gesehen hab. Vorallem bei Bools ist das ziemlich praktisch:
CPP:
struct CoolChar
{
   union
   {
      char value;

      struct
      {
         bool bit1 : 1;
         bool bit2 : 1;
         bool bit3 : 1;
         bool bit4 : 1;
         bool bit5 : 1;
         bool bit6 : 1;
         bool bit7 : 1;
         bool bit8 : 1;
      };
   };
};
Es gibt noch zig andere nützliche Sachen damit, du könntest jetzt z.B. in der union oder der struct noch operator[] definieren und damit auf die bits per index zugreifen... =) Möglichkeiten unbegrenz Cool

Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
xardias
JLI Master


Alter: 37
Anmeldedatum: 28.12.2003
Beiträge: 804
Wohnort: Palo Alto, CA
Medaillen: Keine

BeitragVerfasst am: 19.01.2008, 01:10    Titel: Antworten mit Zitat

ich bezweifle dass der letzte code funktioniert.. es würde mich zumindestens ziemlich wundern.

dazu müsste ein boolean 1 bit groß sein, ist es aber nicht. man kann in c++ nicht einfach so auf bits zugreifen. dazu muss man mit bitmasken arbeiten.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
GreveN
JLI Master


Alter: 37
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 19.01.2008, 02:15    Titel: Antworten mit Zitat

Das klappt und man kann in C++ auch auf einzelne Bits zugreifen. ;)

@DXer:
Das "unsigned char a, b;" äquivalent zu "unsigned char a; unsigned char b" ist, ist mir bewusst, ich bin mir allerdings nicht sicher ob deshalb im Speicher a zwingend vor b liegen muss. ;)

Hast du diesen "Color-Cast" eigentlich schonmal auf Unterschiede zwischen Big Endian/Little Endian-Maschinen getestet? Eigentlich müsste es spätestens da Probleme geben, da der Long-Wert dann u.U. "falsch herum" gelesen wird.

Allerdings ist es 2 Uhr Morgens und ich will mich da jetzt auch nicht zu weit aus dem Fenster lehnen ohne da ordentlich drüber nachgedacht zu haben... ;)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 19.01.2008, 12:24    Titel: Antworten mit Zitat

xardias hat Folgendes geschrieben:
ich bezweifle dass der letzte code funktioniert.. es würde mich zumindestens ziemlich wundern.

dazu müsste ein boolean 1 bit groß sein, ist es aber nicht. man kann in c++ nicht einfach so auf bits zugreifen. dazu muss man mit bitmasken arbeiten.

GreveN hat es schon gesagt, das geht Razz Probiers aus Smile

@GreveN: Es stimmt dass es da Unterschiede in Little-Endian und Big-Endian geben kann, das ist Prozessorspezifisch. Der Schnipsel von mir funktioniert auf Little Endian, was heutzutage von Intel und AMD Prozessoren genutzt wird. Die PPC-Familie (benutzt von Macs) benutzt Big Endian. Möchte man also auch für PPC Spiele schreiben, kann man das per Präprozessor bestimmen. Meistens reicht das jedoch, da hauptsächlich Little Endian gebraucht wird. Außerdem gibt es neben diesem Fall noch zig andere Fälle, die Little Endian vorraussetzen, beispielsweise Dateien: Benutzt man eine Bilddatei unter LE und möchte dieselbe auch unter BE benutzen, muss man im Programm eine ganze Reihe von Endian-Swaps schreiben, was eigtl keiner mehr macht (früher wurde das noch gemacht, s. Quake2). Man kann also getrost den Code verwenden. Wen das dennoch interressiert, kann sich diesen Artikel mal durchlesen.

Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 19.01.2008, 14:38    Titel: Antworten mit Zitat

xardias hat Folgendes geschrieben:
ich bezweifle dass der letzte code funktioniert.. es würde mich zumindestens ziemlich wundern.

dazu müsste ein boolean 1 bit groß sein, ist es aber nicht. man kann in c++ nicht einfach so auf bits zugreifen. dazu muss man mit bitmasken arbeiten.


Türlich geht der... " : 1" sagt dem Compiler, dass du genau ein Bit haben willst.
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum