![]() |
Definitions union von C nach Delphi
Hi Leute,
da ich mit der Sache rein gar nichts anfangen kann, heute mal so rum gerag. Ich habe mal wieder einen C++ Header den ich nach Delphi bringen muss. Da habe ich folgenden Konstrukt den ich nicht kenne:
Code:
Im Besoderen geht es mit hier um die Definition des union-Bereiches. Mit den Strukturen komme ich klar. Kann mir jemand sagen, wie ich das nach Delphi 2007 bringe un was da definiert wird?
typedef union
{ uint_32t l; uint_8t b[4]; } aes_inf; typedef struct { uint_32t ks[KS_LENGTH]; aes_inf inf; } aes_encrypt_ctx; typedef struct { uint_32t ks[KS_LENGTH]; aes_inf inf; } aes_decrypt_ctx; Gruß oki |
Re: Definitions union von C nach Delphi
Unions sind Objekte, die sich an der selben Speicheradresse befinden (sowas wie ein typisierter Alias).
In Delphi lässt sich das über "variante Records" abbilden:
Delphi-Quellcode:
Hinweis: einfach runtergetippt, kein Anspruch auf Kompilierbarkeit :)
type
PAesInf = ^TAesInf; TAesInf = record case Integer of 4: (l: LongWord); 1: (b: array [0..3] of Byte); { end; } end; type PAesEncryptCtx = ^TAesEncryptCtx; TAesEncryptCtx = record ks: array [0..KS_LENGTH-1] of LongWord; inf: TAesInf; end; type PAesDecryptCtx = ^TAesDecryptCtx; TAesDecryptCtx = record ks: array [0..KS_LENGTH-1] of LongWord; inf: TAesInf; end; |
Re: Definitions union von C nach Delphi
Zitat:
Union ist doch nur, dass diese Struktur unterschiedliche Werte annehmen kann( IMHO ). Also nimm doch einfach Record und z.B. dann die ^Recordbezeichnung aes_inf als Variable. |
Re: Definitions union von C nach Delphi
Ähhhm,
sorry, das bring ich jetzt nicht zusammen. Zitat:
2. Was verstehst du unter Variante Records? Soll das bedeuten, dass der Wert in inf sowohl vom Typ Longword als auch Array of Byte sein kann? @Der.Kaktus: Das hab ich nicht verstanden: Zitat:
|
Re: Definitions union von C nach Delphi
Zitat:
Zitat:
TAesInf ist so groß wie seine größte "Interpretationsmöglichkeit" (4 Bytes in beiden Fällen). (edit: wenn man den Wert von "l" ändert, ändert man auch den Inhalt von "b" - und vis versa) In der Delphi-Hilfe gibt es sicherlich einen Abschnitt zu "varianten (Teilen von) Records". |
Re: Definitions union von C nach Delphi
Hi nicodex,
ich habs gerafft. Dank für die Hilfe. Gruß oki |
Re: Definitions union von C nach Delphi
Zitat:
![]()
Delphi-Quellcode:
P.S.: Bin zwar keine "C-Wolke" aber glaube so ging die Umwandlung. :wink:
Type union = Record
l:integer; b:Array[0..3] of smallint; end; var aes_inf: ^union; |
Re: Definitions union von C nach Delphi
Zitat:
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. |
Re: Definitions union von C nach Delphi
Zitat:
Code:
Somit interpretiere ich dies auch als einen vorzeichenlosen 8-Bit Wert. Das sollte dann imho auch der Typ Byte sein.
uint_8t b[4];
Trotzdem auch an dich herzlichen Dank Der.Kaktus. Mit eurer Hilfe konnte ich doch schnell Licht ins Dunkel bringen. Gruß oki |
Re: Definitions union von C nach Delphi
Jetzt doch noch eine Frage hinterher.
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. So hab ich es jedenfalls verstanden. in der angegebenen Erläuterung zu union von nicodex (Link) ist aber folgendes Beispiel angegeben:
Code:
hier sind doch definitiv unterschiedliche Längen definiert. Ein
typedef union {
float einfach; double mittel; long double hoch; } Reell;
Delphi-Quellcode:
ist doch sicher nicht zulässig. Oder doch?
TReell = record
case Double of einfach : Float; mittel : Double; hoch : Int64; end; Gruß oki |
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. |
Re: Definitions union von C nach Delphi
Zitat:
Gruß oki |
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:
wobei ich eben die genaue Delphisyntax nicht kenne.
TReell = record
case Integer of 0: (einfach : Float); 1: (mittel : Double); 2: (hoch : Extended); end; |
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 |
Re: Definitions union von C nach Delphi
Zitat:
Nehmen wir mal einen eigenen Oridnaltyp (hier eine Aufzählung):
Delphi-Quellcode:
Und einen Record mit variantem Teil:
type
TDataType = ( dtFoo, dtBar );
Delphi-Quellcode:
Dies hilft dem lesenden Entwickler zu verstehen, wann die Daten in welcher Art und Weise zu interpretieren sind.
type
TDataBlob = record DataSize: UInt64; case DataType: TDataType of dtFoo: ( AsFoo: Integer{;} ); dtBar: ( AsBar: record Bar1: Double; Bar2: UInt64; end{;} ); { end; } end; DataType ist in diesem Falle ein Member des Records (technisch ist es das selbe wie):
Delphi-Quellcode:
Man hätte auch wie folgend definieren können:
type
TDataBlob = record DataSize: UInt64; DataType: TDataType; case TDataType of dtFoo: ( AsFoo: Integer{;} ); dtBar: ( AsBar: record Bar1: Double; Bar2: UInt64; end{;} ); { end; } end;
Delphi-Quellcode:
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 :))...
type
TDataBlob = record DataSize: UInt64; DataType: TDataType; case Boolean of False: ( Value1: Integer{;} ); True: ( Value2: Double; Value3: UInt64{;} ); { end; } end; edit: Zitat:
(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 |
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 |
Re: Definitions union von C nach Delphi
Zitat:
Gruß oki |
Re: Definitions union von C nach Delphi
Zitat:
Viel Erfolg mit der weiteren Übersetzung des Headers. |
Re: Definitions union von C nach Delphi
|
Re: Definitions union von C nach Delphi
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:59 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