Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Blockread mit Struktur hängt bei double (https://www.delphipraxis.net/132881-blockread-mit-struktur-haengt-bei-double.html)

0xDEAD 21. Apr 2009 11:08


Blockread mit Struktur hängt bei double
 
Hallo,

ich hab hier grad ein komisches Problem das ich nicht verstehe.

Habe ein altes Programm "geerbt" und versuche das zu verstehen.

Ich habe ein Record die ich über ein blockread aus einer Datei lade.

Delphi-Quellcode:

 DtaHedT = record
   IdentStr: FileVersionT;
   ProjDirN: string[255];
   ProgNum: longint;
   DateTime: double;
   StopNum: longint;
   DataSrcN: string[255];
// hier folgt noch einiges
end;
Delphi-Quellcode:
  {$I-}blockread(f,DtaHed,SizeOf(DtaHedT),BytesRead);{$I+}
Ich hab einiges weggelassen, aber das sollte zum verstehen reichen.
Soweit alles klar?
Die Datei wird ausgelesen und die Struktur gefüllt. Jedoch ab DateTime ist irgendwie der Wurm drinnen.
Die Daten scheinen verschoben.

Wenn ich den double in ein
Delphi-Quellcode:
array[1..8] of byte
ändere klappt alles und der Record sitzt wie ne Eins.

Was ist da los? Wo ist der Fehler?
Mit dem alten Code sollte es doch funktionieren.

p80286 21. Apr 2009 17:21

Re: Blockread mit Struktur hängt bei double
 
Hallo 0xDEAD,

Leider schreibst Du nicht wie alt Das Programm ist.
Darum versuch es mal mit
Delphi-Quellcode:
packed record
dann könnte wieder alles passen.

Irgendwann wurden die Recordfelder auf (Maschinen)Wortgrenzen gelegt und das könnte die Verschiebung erklären.

Gruß
K-H

0xDEAD 23. Apr 2009 08:58

Re: Blockread mit Struktur hängt bei double
 
In der Datei, die ich mir mit einem HexEditor angesehen habe, ist der double-Wert mit 8 Byte vertreten.
Genau an der richtigen Stelle und genau so lang wie ein double eben sein sollte.

Tyrael Y. 23. Apr 2009 09:09

Re: Blockread mit Struktur hängt bei double
 
Es geht nicht darum, daß ein Double 8 Byte sind, sondern wie sie im Speicher "zusammengequetscht" werden.

p80286 hat dir vermutlich schon den richtigen Hinweis gegeben.
Ein packed record könnte reichen.

Wenn du mal in deiner IDE unter Projekt->Optionen->Compiler schaust, gibt es dort ein Feld zum einstellen "Record-Felder ausrichten". Du hast da vermutlich eine 8 stehen, was auch ok ist.

Früher waren die Programme aber auf 1, also packed record ausgerichtet.

0xDEAD 23. Apr 2009 09:43

Re: Blockread mit Struktur hängt bei double
 
AHHH!!!

:coder2:

Jetzt hab ichs kapiert!

Mit nem packed record klappt es wirklich!
Aber das Umstellen von 8 auf 1 in den Projekt Optionen hat nicht hingehauen.

:gruebel:

0xDEAD 23. Apr 2009 09:58

Re: Blockread mit Struktur hängt bei double
 
Hab ich das Problem auch, wenn ich einen FileStream zum lesen verwende, statt dem betagten blockread ?

sirius 23. Apr 2009 10:15

Re: Blockread mit Struktur hängt bei double
 
Ja. Das ist aber doch kein Problem. Das ist ganz normal in Dateien packed records zu verwenden.

Satty67 23. Apr 2009 10:25

Re: Blockread mit Struktur hängt bei double
 
Zitat:

Zitat von 0xDEAD
Mit nem packed record klappt es wirklich!
Aber das Umstellen von 8 auf 1 in den Projekt Optionen hat nicht hingehauen.

Die Umstellung in den Optionen ist auch nicht nötig, denke ich. Die Anweisung
Delphi-Quellcode:
packed record
in der Typ-Deklaration sollte reichen.

TFileStream und BlockRead füllen einen Buffer... sollte bei beiden gleich gut (oder schlecht) funktionieren.

PS: Wenn wir schon dabei sind, falls der Typ "Real" auftaucht, ist da evtl. auch der Tausch mit Real48 nötig (solche Datenbanken hab' ich hier noch zu Hauf)


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