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 2 von 2     12   
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#11

Re: Definitions union von C nach Delphi

  Alt 15. Jul 2008, 18:14
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.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
oki

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

Re: Definitions union von C nach Delphi

  Alt 15. Jul 2008, 18:17
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
42
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#13

Re: Definitions union von C nach Delphi

  Alt 15. Jul 2008, 18:21
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.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
oki

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

Re: Definitions union von C nach Delphi

  Alt 15. Jul 2008, 18:36
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 ).

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

bis denne,

Gruß oki
42
  Mit Zitat antworten Zitat
Benutzerbild von nicodex
nicodex

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

Re: Definitions union von C nach Delphi

  Alt 15. Jul 2008, 18: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
oki

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

Re: Definitions union von C nach Delphi

  Alt 15. Jul 2008, 18:52
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 ).

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 und Gruß

oki
42
  Mit Zitat antworten Zitat
oki

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

Re: Definitions union von C nach Delphi

  Alt 15. Jul 2008, 18:54
Zitat von nicodex:
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")

Gruß Nico
Das war ohne Kommentar aber gemein , und ich denk wunder was da hinter steckt.

Gruß oki
42
  Mit Zitat antworten Zitat
Benutzerbild von nicodex
nicodex

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

Re: Definitions union von C nach Delphi

  Alt 15. Jul 2008, 18:56
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.
  Mit Zitat antworten Zitat
oki

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

Re: Definitions union von C nach Delphi

  Alt 15. Jul 2008, 18:59
Dank dir.

Hab auch schon die nächsten Baustellen Comilerdirektiven

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

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

Re: Definitions union von C nach Delphi

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

Repeat Until true=false;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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:41 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