![]() |
Frage zu einer type definition
Code:
type
T_BUS_Text = record case byte of 0: (b: array[1..20] of byte); 1: (s: array[1..20] of char); 2: (w: array[1..10] of word); end;
Code:
Es werden in dem Code den ich gerade lese dann z.B. EinBeispiel.b[i] von 1 bis 8 gefüllt und dann wird aber mit EinBeispiel.s weitergearbeitet. Wie funktioniert diese Art von Typdefinition?
...
EinBeispiel: T_BUS_Text; ... |
AW: Frage zu einer type definition
Alle 3 Arrays überlagern im Speicher. Alle Daten aus b sind gleichzeitig auch in s und in w.
Ist unterm Strich eine Art cast - Gleiche Daten werden einfach unterschiedlich interpretiert. |
AW: Frage zu einer type definition
Ab Delphi 2009 wird der Code aber so wie er ist nicht mehr funktionieren, man sollte sicherheitshalber eine kleine Änderung vornehmen:
Delphi-Quellcode:
type
T_BUS_Text = record case byte of 0: (b: array[1..20] of byte); 1: (s: array[1..20] of AnsiChar); //Probleme mit Unicode vermeiden 2: (w: array[1..10] of word); end; |
AW: Frage zu einer type definition
Das heißt dann, wenn ich EinBeispiel.b[1] := 77; mache dann habe ich bei EinBeispiel.s[1] ein "M" gespeichert?
|
AW: Frage zu einer type definition
Jo genau.
|
AW: Frage zu einer type definition
Vielen Dank
|
AW: Frage zu einer type definition
Sollte das nicht besser ein packed record sein ?
|
AW: Frage zu einer type definition
Es sind alles Bytes, somit ist es praktisch immer packed.
|
AW: Frage zu einer type definition
byte und word könnte sich evtl. anders anordnen ...
Naja, wenn du sicher bist ist es ja OK. |
AW: Frage zu einer type definition
Arrays sind immer packed.
|
AW: Frage zu einer type definition
Arrays sind Packed, aber wenn der Field-Typ unpacked ist und eine unrunde Größe hat (z.B. 3 Byte Inhalt, aber 4 Byte groß), dann ist das Array natürlich auf die 4 Byte ausgerichtet.
Es gibt kein MinAlign, sondern nur ein MaxAlign, als Compiler-Option. 2 Byte passen "genau" in ein Word, also richten sie sich immer doppelt übereinander aus, egal ob packed oder nicht. |
AW: Frage zu einer type definition
Îch sehe hier wird alles theoretisch perfekt aufarbeitet, super :-D
Ich bin aber leider auch zu oft auf der praktischen Seite unterwegs, und da wird dann aus solchen Konstrukten gerne schnell mal:
Delphi-Quellcode:
Bevor ich mir da alle Optionen durchspiele (die mein Kollege vielleicht nicht so fleissig testet), mache ich einfach
type
T_BUS_Text = record case byte of 0: (b: array[1..20] of byte); 1: (s: array[1..20] of AnsiChar); //Probleme mit Unicode vermeiden 2: (w: array[1..10] of word); // 3: (w: array[1..3] of TDings); // Sind das 9 Bytes ? 4: (w: array[1..5] of TBums); // Sind das 10 Bytes ? 5: (w: array[1..2] of TFlumms); // Sind das 12 Bytes ? 6: //... end; pro Forma ein "packed" davor, und bin erstmal auf der sichere(ren) Seite :stupid: Rollo |
AW: Frage zu einer type definition
Warum durchtesten?
Wenn das "veränderliche" {$ALIGN} bekannt ist, kann ich meistens sofort sagen, wie das ausgerichtet wird Wenn man das "einfache" System erstmal verstanden hat, ist es garnicht mehr so schwer. Nur beim Typen Extended vergesse ich ständig, wie dieser krumme 10-Byte-Typ gerechnet wird. :oops: PS: Das Selbe betrifft natürlich auch die Felder in Objekten (unter Betrachtung des Vorfahren) und auch die globalen Variablen (HEAP), sowie die lokalen Variablen (Sack, nur hier halt rückwärts). PACKED ist echt etwas ganz Schlimmes, denn packed ARRAY/RECORD werden als FieldSize=1 gerechnet, also ab da nicht mehr optimal ausgerichtet. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:26 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 by Thomas Breitkreuz