Zitat von
oki:
Durch den Case auf Integer ist ja festgelegt, dass die einzelnen Elemente des Records zwar unterschiedlichen Typs sein dürfen, aber im Speicher alle die gleiche Länge (Integer = 32 Bit) haben müssen.
Nein, der Typ dient nur als "Index" für die verschiedenen Varianten der Union. Beim "Index" muss es sich übrigens um einen Ordinaltyp handeln.
Nehmen wir mal einen eigenen Oridnaltyp (hier eine Aufzählung):
Delphi-Quellcode:
type
TDataType = (
dtFoo,
dtBar
);
Und einen Record mit variantem Teil:
Delphi-Quellcode:
type
TDataBlob = record
DataSize: UInt64;
case DataType: TDataType of
dtFoo: (
AsFoo: Integer{;}
);
dtBar: (
AsBar: record
Bar1: Double;
Bar2: UInt64;
end{;}
);
{ end; }
end;
Dies hilft dem lesenden Entwickler zu verstehen, wann die Daten in welcher Art und Weise zu interpretieren sind.
DataType ist in diesem Falle ein Member des Records (technisch ist es das selbe wie):
Delphi-Quellcode:
type
TDataBlob = record
DataSize: UInt64;
DataType: TDataType;
case TDataType of
dtFoo: (
AsFoo: Integer{;}
);
dtBar: (
AsBar: record
Bar1: Double;
Bar2: UInt64;
end{;}
);
{ end; }
end;
Man hätte auch wie folgend definieren können:
Delphi-Quellcode:
type
TDataBlob = record
DataSize: UInt64;
DataType: TDataType;
case Boolean of
False: (
Value1: Integer{;}
);
True: (
Value2: Double;
Value3: UInt64{;}
);
{ end; }
end;
Das ist vom Aufbau her (fast) gleich. Nur ist es für den Lesenden (ohne weitere Dokumentation) nicht klar ersichtlich, wie die Daten des varianten Teils zu interpretieren sind (also wie man es nicht machen sollte
)...
edit:
Zitat von
oki:
Wenn nach deiner Meinung Integer nur für eine "Indizierung" verwendet wird, dann versteh ich das mit 4 un 1 in nicodex Übersetzung gar nicht (versteh ich auch so noch nicht
).
Die Indexwerte konnte ich willkürlich wählen. Da ich die Wahl hatte, habe ich versucht den Record allein durch den Quelltext zu dokumentieren... 4 = die Daten werden als (Array von) 4-Byte-Wert(en) interpretiert, 1 = die Daten werden als Array von 1-Byte-Werten interpretiert.
(ich mache das einfach schon zu lange, um Dinge einfach so zu übersetzen, dass sie "einfach nur funktionieren")
edit2: mit aktuellen Delphi-Versionen wäre ich sogar noch weiter gegangen, und hätte diverse Operatoren überladen/eingeführt (damit man zum Beispiel ein TAesInf einem LongWord direkt zuweisen kann und vis versa).
Gruß Nico