Einzelnen Beitrag anzeigen

Benutzerbild von nicodex
nicodex

Registriert seit: 2. Jan 2008
Ort: Darmstadt
286 Beiträge
 
Delphi 2007 Professional
 
#15

Re: Definitions union von C nach Delphi

  Alt 15. Jul 2008, 18:43
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
  Mit Zitat antworten Zitat