![]() |
Komisches mit variantem record
Hallo,
ich nutze einen varianten Record um auch byteweise auf TDateTime zugreifen zu können. Soweit so gut, Code siehe hier:
Delphi-Quellcode:
Wenn ich jetzt mit dem Debugger SizeOf(dt) abfrage kommt immer 16 raus,
/// <summary>
/// Varianter Record für TDateTime um auf das auch byteweise zugreifen zu können /// </summary> TVariantDateTime = record case Bytewise: Boolean of /// <summary> /// Zeitstempel als Zeitstempel /// </summary> false : (TimeStamp:TDateTime); /// <summary> /// Zeitstempel als Bytes /// </summary> true : (Bytes:array[0..7] of UInt8); end; var dt:TVariantDateTime; statt der erwarteten 8. Frage ich SizeOf(dt.TimeStamp) ab, kommt 8 raus. Warum? Grüße TurboMagic |
AW: Komisches mit variantem record
Das erste Byte ist wohl Bytewise und bei
Delphi-Quellcode:
kommt dann 1 + 8 = 9 raus.
TVariantDateTime = packed record
Ohne packed entscheidet die Compilereinstellung Recordfelder ausrichten über die Größe des Records. |
AW: Komisches mit variantem record
Mit dem Packed hast du wohl recht...
|
AW: Komisches mit variantem record
Du kannst den varianten Teil auch so schreiben, dann kommt als Größe auch 8 heraus:
Delphi-Quellcode:
TVariantDateTime = record
case Boolean of false : (TimeStamp:TDateTime); true : (Bytes:array[0..7] of UInt8); end; |
AW: Komisches mit variantem record
Ich würde das aber ehrlich gesagt nicht als varianten Record machen. Eigentlich sind "class helper" dazu die bessere Wahl.
Nicht umsonst haben
Delphi-Quellcode:
und
Single
Delphi-Quellcode:
das auch schon fest eingebaut sodass du z.B. sagen kannst
Double
Delphi-Quellcode:
.
meinSingle.Bytes[3]
|
AW: Komisches mit variantem record
Wenn das schon als CLassHelper drin ist noch besser. Stelle dann evtl. morgen darauf um.
|
AW: Komisches mit variantem record
Zitat:
Und duch die Speicherausrichtung {$ALIGN rutscht dein Timestamp eine "ganze" Position weiter, womit der Record dann enorm anwächst. Bei Packed, wird der Freiraum zwischen diesem Byte und deinem Timestamp weggelassen, es bleibt aber dennoch ein Byte zuviel. Zitat:
Delphi-Quellcode:
Deine Variante und diese Variante kann man nutzen, um sich zu merken was man gespeichert hat.
TVariantDateTime = record
Bytewise: Boolean; case Boolean of false : (TimeStamp:TDateTime); true : (Bytes:array[0..7] of UInt8); end; Ähnlich wie beim "richtigen" ![]() siehe System.pas > TVarData und "Variant type codes" ala varInteger (Delphi) bzw. vt_i4 (WinAPI) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:50 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