AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

FillChar und (packed) Records?

Ein Thema von ernschd · begonnen am 5. Mai 2009 · letzter Beitrag vom 5. Mai 2009
Antwort Antwort
ernschd

Registriert seit: 16. Jan 2008
166 Beiträge
 
Delphi XE8 Professional
 
#1

FillChar und (packed) Records?

  Alt 5. Mai 2009, 10:41
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
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: FillChar und (packed) Records?

  Alt 5. Mai 2009, 10:53
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>
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

Re: FillChar und (packed) Records?

  Alt 5. Mai 2009, 10:58
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
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)
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von nicodex
nicodex

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

Re: FillChar und (packed) Records?

  Alt 5. Mai 2009, 10:59
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 ).
  Mit Zitat antworten Zitat
ernschd

Registriert seit: 16. Jan 2008
166 Beiträge
 
Delphi XE8 Professional
 
#5

Re: FillChar und (packed) Records?

  Alt 5. Mai 2009, 12:17
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.

Auf jeden Fall funktioniert jetzt auch der FillChar wie gewünscht.
Gibt es noch mehr solcher Fallen, von denen ich wissen sollte?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: FillChar und (packed) Records?

  Alt 5. Mai 2009, 12:19
TP war ein 16Bit Compiler ( 2 Byte) ; Delphi ist bisher ein 32-Bit Compiler (4 Byte); ab Commodore dann 64Bit (8 Byte)
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

Re: FillChar und (packed) Records?

  Alt 5. Mai 2009, 12:41
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 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]
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort


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 17:45 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