Delphi-PRAXiS
Seite 1 von 2  1 2      

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)

oki 15. Jul 2008 14:48


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:
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;
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?

Gruß oki

nicodex 15. Jul 2008 14:55

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:
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;
Hinweis: einfach runtergetippt, kein Anspruch auf Kompilierbarkeit :)

Der.Kaktus 15. Jul 2008 14:56

Re: Definitions union von C nach Delphi
 
Zitat:

Zitat von oki
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:
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;
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?

Gruß oki

Hallo,

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.

oki 15. Jul 2008 15:05

Re: Definitions union von C nach Delphi
 
Ähhhm,

sorry, das bring ich jetzt nicht zusammen.


Zitat:

Zitat von nicodex
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

1. Objekte sind doch Instanzen von Klassen. Deine union Übrsetzung ist hier aber ein Record.
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:

Zitat von Der.Kaktus
Also nimm doch einfach Record und z.B. dann die ^Recordbezeichnung aes_inf als Variable.

Guß oki

nicodex 15. Jul 2008 15:14

Re: Definitions union von C nach Delphi
 
Zitat:

Zitat von oki
1. Objekte sind doch Instanzen von Klassen. Deine union Übrsetzung ist hier aber ein Record.

Ich meinte "Objekt" im Sinne der Sprache C/C++... vielleicht hätte ich "Werte" oder "Variablen" schreiben sollen :)

Zitat:

Zitat von oki
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 Inhalt eines TAesInf kann entweder als LongWord "l" (4 Bytes) oder als Array von 4 Bytes "b" interpretiert/verwendet werden.
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".

oki 15. Jul 2008 15:18

Re: Definitions union von C nach Delphi
 
Hi nicodex,

ich habs gerafft.

Dank für die Hilfe.

Gruß oki

Der.Kaktus 15. Jul 2008 15:21

Re: Definitions union von C nach Delphi
 
Zitat:

Zitat von oki
Ähhhm,

sorry, das bring ich jetzt nicht zusammen.

...

@Der.Kaktus:
Das hab ich nicht verstanden:

Zitat:

Zitat von Der.Kaktus
Also nimm doch einfach Record und z.B. dann die ^Recordbezeichnung aes_inf als Variable.

Guß oki

schau mal hier Union

Delphi-Quellcode:
Type union = Record
              l:integer;
              b:Array[0..3] of smallint;
             end;

var aes_inf: ^union;
P.S.: Bin zwar keine "C-Wolke" aber glaube so ging die Umwandlung. :wink:

nicodex 15. Jul 2008 15:38

Re: Definitions union von C nach Delphi
 
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.

oki 15. Jul 2008 17:01

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.

Ich würde hier auch nicodex recht geben, da die Definition für den Record in C++ ja lautet:
Code:
uint_8t b[4];
Somit interpretiere ich dies auch als einen vorzeichenlosen 8-Bit Wert. Das sollte dann imho auch der Typ Byte sein.

Trotzdem auch an dich herzlichen Dank Der.Kaktus. Mit eurer Hilfe konnte ich doch schnell Licht ins Dunkel bringen.

Gruß oki

oki 15. Jul 2008 17:11

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:
typedef union {
     float einfach;
     double mittel;
     long double hoch;
} Reell;
hier sind doch definitiv unterschiedliche Längen definiert. Ein
Delphi-Quellcode:
  TReell = record
    case Double of
      einfach : Float;
      mittel : Double;
      hoch : Int64;
  end;
ist doch sicher nicht zulässig. Oder doch?

Gruß oki


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:54 Uhr.
Seite 1 von 2  1 2      

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