Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Frage zu einer type definition (https://www.delphipraxis.net/194124-frage-zu-einer-type-definition.html)

A.Griffin 19. Okt 2017 14:47

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:
...
EinBeispiel: T_BUS_Text;
...
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?

Neutral General 19. Okt 2017 15:06

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.

DeddyH 19. Okt 2017 15:15

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;

A.Griffin 19. Okt 2017 15:48

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?

Neutral General 19. Okt 2017 15:50

AW: Frage zu einer type definition
 
Jo genau.

A.Griffin 19. Okt 2017 15:51

AW: Frage zu einer type definition
 
Vielen Dank

Rollo62 19. Okt 2017 21:08

AW: Frage zu einer type definition
 
Sollte das nicht besser ein packed record sein ?

himitsu 20. Okt 2017 01:26

AW: Frage zu einer type definition
 
Es sind alles Bytes, somit ist es praktisch immer packed.

Rollo62 20. Okt 2017 11:08

AW: Frage zu einer type definition
 
byte und word könnte sich evtl. anders anordnen ...

Naja, wenn du sicher bist ist es ja OK.

Stevie 20. Okt 2017 11:52

AW: Frage zu einer type definition
 
Arrays sind immer packed.

himitsu 20. Okt 2017 13:09

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.

Rollo62 20. Okt 2017 18:59

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:
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;
Bevor ich mir da alle Optionen durchspiele (die mein Kollege vielleicht nicht so fleissig testet), mache ich einfach
pro Forma ein "packed" davor, und bin erstmal auf der sichere(ren) Seite :stupid:

Rollo

himitsu 21. Okt 2017 03:26

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 22:55 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