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
Seite 1 von 2  1 2      
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#1

Definitions union von C nach Delphi

  Alt 15. Jul 2008, 15:48
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
42
  Mit Zitat antworten Zitat
Benutzerbild von nicodex
nicodex

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

Re: Definitions union von C nach Delphi

  Alt 15. Jul 2008, 15:55
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
  Mit Zitat antworten Zitat
Benutzerbild von Der.Kaktus
Der.Kaktus

Registriert seit: 22. Jan 2008
Ort: Erfurt
958 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Definitions union von C nach Delphi

  Alt 15. Jul 2008, 15:56
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.
Gruss Kaki

Repeat Until true=false;
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Definitions union von C nach Delphi

  Alt 15. Jul 2008, 16:05
Ähhhm,

sorry, das bring ich jetzt nicht zusammen.


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 von Der.Kaktus:
Also nimm doch einfach Record und z.B. dann die ^Recordbezeichnung aes_inf als Variable.
Guß oki
42
  Mit Zitat antworten Zitat
Benutzerbild von nicodex
nicodex

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

Re: Definitions union von C nach Delphi

  Alt 15. Jul 2008, 16:14
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 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".
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Definitions union von C nach Delphi

  Alt 15. Jul 2008, 16:18
Hi nicodex,

ich habs gerafft.

Dank für die Hilfe.

Gruß oki
42
  Mit Zitat antworten Zitat
Benutzerbild von Der.Kaktus
Der.Kaktus

Registriert seit: 22. Jan 2008
Ort: Erfurt
958 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Definitions union von C nach Delphi

  Alt 15. Jul 2008, 16:21
Zitat von oki:
Ähhhm,

sorry, das bring ich jetzt nicht zusammen.

...

@Der.Kaktus:
Das hab ich nicht verstanden:

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.
Gruss Kaki

Repeat Until true=false;
  Mit Zitat antworten Zitat
Benutzerbild von nicodex
nicodex

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

Re: Definitions union von C nach Delphi

  Alt 15. Jul 2008, 16:38
Zitat von Der.Kaktus:
glaube so ging die Umwandlung.
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.
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Definitions union von C nach Delphi

  Alt 15. Jul 2008, 18:01
Zitat von nicodex:
Zitat von Der.Kaktus:
glaube so ging die Umwandlung.
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
42
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#10

Re: Definitions union von C nach Delphi

  Alt 15. Jul 2008, 18:11
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
42
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 16:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz