Entwickler-Ecke

Sonstiges (Delphi) - Union?


Lupin003 - Di 23.12.03 01:07
Titel: Union?
Nein, ich frage nicht nach einer Partei, sondern nach Unions aus C++, denn ich möchte gerne einen Typ erstellen auf den ich auf 2 Arten zugreifen kann. Ich will einmal ganz einfach als 32bit variable dadrauf zugreifen und einmal alle 4 bytes einzeln (es handelt sich um einen Farbwert). Wie mach ich das am schlausten? Ich hab bisher immer mit Pointerkonstruktionen gearbeitet, aber das kommt mir irgendwie dumm vor :)


Delete - Di 23.12.03 01:21

Nur mal so ein Gedanke: Entsprechen Unions nicht Records in Delphi? Ich bin mir nicht sicher, aber ich meine gehört zu haben, dass Unions die alte Art sind strrucs zu definieren.


Anonymous - Di 23.12.03 01:35

So sollte es gehen:


Delphi-Quelltext
1:
2:
3:
4:
5:
Tdeinrec = record
 case integer of
  0: (asdword: dword);
  1: (r,g,b,a: byte);
 end;


Lupin003 - Di 23.12.03 14:44
Titel: wow ty
Funktioniert! Danke!

Allerdings macht dieses case of für mich überhaupt keinen sinn... delphi ist manchmal irgendwie sehr komisch ^^


ErnestoChe - Di 23.12.03 14:55

Hi,

Luckie hat folgendes geschrieben:
Nur mal so ein Gedanke: Entsprechen Unions nicht Records in Delphi? Ich bin mir nicht sicher, aber ich meine gehört zu haben, dass Unions die alte Art sind strrucs zu definieren.


Nein. Unions und Strukturen sind zwei verschiedene Dinge, auch wenn die Deklaration ähnlich aussieht. Struct entspricht einem record in Delphi. Bei einem union dagegen belegen alle Elemente den selben Speicher. D.h. es ist immer nur ein Element gültig:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
union MyUnion
{
  int i;
  char c;
};

int main()
{
  MyUnion u;

  u.i = 2;
  cout << u.i << endl;
  u.c = 'A';              // <---- u.i ist nicht mehr gültig, dafür u.c
  cout << u.c << endl;
  cout << u.i << endl;    // <---- Achtung, u.i enthält Müll, bzw. den Inhalt von u.c

  return 0;
}


MFG

- Ernesto -


ErnestoChe - Di 23.12.03 15:27

Hi,

Lupin003 hat folgendes geschrieben:
Allerdings macht dieses case of für mich überhaupt keinen sinn... delphi ist manchmal irgendwie sehr komisch ^^


Wenn man von C++ kommt ist das allerdings missverständlich und sehr verwirrend. Aber von der Syntax her wird damit dem Compiler klargemacht, dass es sich um einen varianten record bzw. den varianten Teil eines records handelt.

Die Delphi-hilfe hat dazu auch einen Artikel. Kannst du ja mal nachschauen.

MFG

- Ernesto -