AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Definitions union von C nach Delphi

Ein Thema von oki · begonnen am 15. Jul 2008 · letzter Beitrag vom 15. Jul 2008
Antwort Antwort
Benutzerbild von nicodex
nicodex

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

Re: Definitions union von C nach Delphi

  Alt 15. Jul 2008, 17: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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz