Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Definitions union von C nach Delphi (https://www.delphipraxis.net/117294-definitions-union-von-c-nach-delphi.html)

OregonGhost 15. Jul 2008 17:14

Re: Definitions union von C nach Delphi
 
Ist bei den Delphi-Unions das case Integer of nicht mehr so eine syntaktische Sache? Ich würde jedenfalls erwarten, dass der Compiler die Größe selbstständig ermittelt.

Davon abgesehen wäre ein long double eher ein Extended in Delphi oder sowas, kein Int64.

oki 15. Jul 2008 17:17

Re: Definitions union von C nach Delphi
 
Zitat:

Zitat von OregonGhost
Ist bei den Delphi-Unions das case Integer of nicht mehr so eine syntaktische Sache? Ich würde jedenfalls erwarten, dass der Compiler die Größe selbstständig ermittelt.

Jo, also das Case einfach weg lassen? Wie soll das dann aussehen?

Gruß oki

OregonGhost 15. Jul 2008 17:21

Re: Definitions union von C nach Delphi
 
Ne, ich meine, einfach immer case Integer of nehmen, wenn ich das richtig verstehe, ist das doch nur dazu da, den Typ anzugeben, mit dem man die Varianten bezeichnet (also zum Beispiel 4 und 1 in Post #2, wobei ich da einfach aufsteigende Indizes verwenden würde).
Kann mich aber auch irren :)

Edit: Also für dein letztes Beispiel halt
Delphi-Quellcode:
TReell = record
    case Integer of
      0: (einfach : Float);
      1: (mittel : Double);
      2: (hoch : Extended);
  end;
wobei ich eben die genaue Delphisyntax nicht kenne.

oki 15. Jul 2008 17:36

Re: Definitions union von C nach Delphi
 
Hi OregonGhost,

und ich dachte schon ich hab es verstanden. sieht wohl doch nicht so aus. 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 :roll: ).

Ich glaub, ich sollte doch noch mal unter dem Stichwort variante Records nachlesen. Vielleicht bin ich dann schlauer.

bis denne,

Gruß oki

nicodex 15. Jul 2008 17:43

Re: Definitions union von C nach Delphi
 
Zitat:

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:

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 :roll: ).

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

oki 15. Jul 2008 17:52

Re: Definitions union von C nach Delphi
 
Ahhh,

Licht am Horizont. Jetzt hab ich es wohl wirklich gerafft. So ist übrigens auch LParam und WParam in TMessage definiert. Tausendmal verwendet und nichts passiert (im Kopf :idea: ).

Dank Dir Nicodex. Imho ist es dann so, dass im speziellen Fall MaxInt-Anzahl von Elementen im Record über die Case-Anweisung indiziert werden können. Integer kann nach deinen Ausführungen durch jeden ordinalen Typ ersetzt werden. Somit sollte auch ein Enum-Typ funktionieren.

Dank Dir :thumb: und Gruß

oki

oki 15. Jul 2008 17:54

Re: Definitions union von C nach Delphi
 
Zitat:

Zitat von nicodex
edit:
Zitat:

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 :roll: ).

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")

Gruß Nico

Das war ohne Kommentar aber gemein :wink: , und ich denk wunder was da hinter steckt.

Gruß oki

nicodex 15. Jul 2008 17:56

Re: Definitions union von C nach Delphi
 
Zitat:

Zitat von oki
Licht am Horizont.
[...]
Imho ist es dann so, dass im speziellen Fall MaxInt-Anzahl von Elementen im Record über die Case-Anweisung indiziert werden können. Integer kann nach deinen Ausführungen durch jeden ordinalen Typ ersetzt werden. Somit sollte auch ein Enum-Typ funktionieren.

Herzlichen Glückwunsch, sie wurden erleuchtet.
Viel Erfolg mit der weiteren Übersetzung des Headers.

oki 15. Jul 2008 17:59

Re: Definitions union von C nach Delphi
 
Dank dir.

Hab auch schon die nächsten Baustellen Comilerdirektiven

Gruß

Der.Kaktus 15. Jul 2008 18:34

Re: Definitions union von C nach Delphi
 
Zitat:

Zitat von nicodex
Zitat:

Zitat von Der.Kaktus
glaube so ging die Umwandlung. :wink:

Deine Übersetzung der Union ist leider nicht korrekt (bei deiner Definition sind "l" und "b" unterschiedliche Variablen/Werte).
Zudem hat Delphis SmallInt 16-Bit inklusive Vorzeichen (es sollten 8 ohne Vorzeichen sein: Byte).
Um es zu verdeutlichen: Die C-Deklaration ist 4 Bytes groß, deine allerdings 12 Bytes.

Danke Danke :oops:


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:23 Uhr.
Seite 2 von 2     12   

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