Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi FillChar und (packed) Records? (https://www.delphipraxis.net/133582-fillchar-und-packed-records.html)

ernschd 5. Mai 2009 09:41


FillChar und (packed) Records?
 
Hallo,

ich bin grade dabei, ein altes Pascal-Programm nach Delphi zu portieren.
Darin werden mittels der Move-Routine Daten byteweise verschoben.
Leider sind in Delphi Record-Typen anscheinend standardmäßig "variabel" in der Byte-Größe, wenn das Schlüsselwort packed nicht verwendet wird, von daher erzeugt der Move allerhand lustige Ergebnisse, jedoch nicht das, was ich will.

Muss ich mit packed arbeiten bzw. mit der Compiler-Direktive {$A-}, oder gibts noch eine andere Lösung?

Des weiteren habe ich noch das Problem, dass ein FillChar auf den Pointer des Records unter Delphi nicht funktioniert, zumindest auf manche Typen darin.
Delphi-Quellcode:
New(Z_N);
{Egal ob}
FillChar (Z_N^, SizeOf (Z_N^), ' ');
{oder} 
FillChar (Z_N^, SizeOf (Z_N^), #0);
In meinem Fall ist dann Z_N^.A (ein Integer) nicht leer oder Null, obwohl es zuvor initialisiert wurde. Liegt das an packed?

Und wieso finde ich in der Hilfe von Delphi 2005 kaum was zu diesen Thema? Die Hilfe von Delphi 7 ist meiner Meinung nach wesentlich besser.

Vielen Dank.

Ernschd

quendolineDD 5. Mai 2009 09:53

Re: FillChar und (packed) Records?
 
Der Record ist nur dann variabel, wenn Typen wie Strings verwendet werden. Integer usw. sind immer 4 Byte groß.
Außerdem würde ich die Move-Methode substituieren. Die kannst du afaik nehmen, wenn dir der Datentyp unbekannt ist.

Also bei mir funktioniert das mit FillChar.

Die neuen Hilfen sind imho immer informationsleerer. Teilweise steht zu <Methode> nur noch das ist <Methode> von <Objekt> :twisted:

himitsu 5. Mai 2009 09:58

Re: FillChar und (packed) Records?
 
am packed sollte es nicht liegen ... das richtet ja nur die Felder im Record anders aus und sonst nix.

versuch es mal so ... vielleicht geht ja nur was beim dereferenzieren schief :gruebel:
Delphi-Quellcode:
ZeroMemory(Z_N, SizeOf(Z_N^));
oder direkt über den Typ
Delphi-Quellcode:
type Z_N: ^TypOf;
ZeroMemory(Z_N, SizeOf(TypOf));
bzw. schau mal was SizeOf bei dir liefert
(entweder irgendwo ausgeben, oder einfach mal debuggen und den Mauszeiger kurz hinter die Klammer von SizeOf(Z_N^) halten, dann sollte der Debugger den Wert auch anzeigen)

nicodex 5. Mai 2009 09:59

Re: FillChar und (packed) Records?
 
Zitat:

Zitat von ernschd
Leider sind in Delphi Record-Typen anscheinend standardmäßig "variabel" in der Byte-Größe, wenn das Schlüsselwort packed nicht verwendet wird, von daher erzeugt der Move allerhand lustige Ergebnisse, jedoch nicht das, was ich will.

Die Mitglieder der Struktur werden anhand ihrer Größe ausgerichtet.
Dein Beispiel-Code sollte funktionieren, ist nur die Frage, was deine Erwartungshaltung ist (wenn die Struktur Teil einer Schnittstelle ist, dass muss sie so definiert werden, dass sie selbiger entspricht - wenn dazu 'packed' gehört, dnan ist das halt so :)).

ernschd 5. Mai 2009 11:17

Re: FillChar und (packed) Records?
 
Ok, der Fehler lag an einer ganz anderer Stelle: in Pascal ist ein Integer-Wert 2 Byte groß, in Delphi 4!
Schön, dass darauf in der Dokumentation hingewiesen wird. :x

Auf jeden Fall funktioniert jetzt auch der FillChar wie gewünscht.
Gibt es noch mehr solcher Fallen, von denen ich wissen sollte?

mkinzler 5. Mai 2009 11:19

Re: FillChar und (packed) Records?
 
TP war ein 16Bit Compiler ( 2 Byte) ; Delphi ist bisher ein 32-Bit Compiler (4 Byte); ab Commodore dann 64Bit (8 Byte)

himitsu 5. Mai 2009 11:41

Re: FillChar und (packed) Records?
 
Integer und Cardinal sind keine nativen Datentypen, genausowenig wie Char
(außerdem verhalten sich Pointer und Objektrefferenzen und andere Zeige meißt ebenso wie der Integer)


Integer und Cardinal sind so groß, wie der Standardrechentyp der jeweiligen CPU, für welchen der Compiler ausgelegt ist (Größen siehe mkinzler)

Char ist bis einschliesslich D2007 ein 1 Byte großer AnsiChar und seit D2009 ein 2 Byte kleiner WideChar.

Zitat:

Zitat von OH
Es gibt zwei generische Integer-Typen: Integer und Cardinal. Diese Typen sollten, wenn möglich, immer verwendet werden, da sie die optimale Ausführungsgeschwindigkeit für die zugrundeliegende CPU und das Betriebssystem gewährleisten. Die nachfolgende Tabelle enthält die Bereiche und Speicherformate der generischen Integer-Typen für den aktuellen 32-Bit-Compiler von Delphi.

Generische Integer-Typen für 32-Bit-Implementationen von Delphi
Typ * * * * Bereich * * * * Format
Integer * * * * -2147483648..2147483647 * * * * 32 Bit, mit Vorzeichen
Cardinal * * * * 0..4294967295 * * * * 32 Bit, ohne Vorzeichen

[edit=mkinzler]Auf Wunsch von Frank Jahreszahl korrigiert Mfg, mkinzler[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:09 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