![]() |
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:
Ich hab einiges weggelassen, aber das sollte zum verstehen reichen.
{$I-}blockread(f,DtaHed,SizeOf(DtaHedT),BytesRead);{$I+}
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:
ändere klappt alles und der Record sitzt wie ne Eins.
array[1..8] of byte
Was ist da los? Wo ist der Fehler? Mit dem alten Code sollte es doch funktionieren. |
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:
dann könnte wieder alles passen.
packed record
Irgendwann wurden die Recordfelder auf (Maschinen)Wortgrenzen gelegt und das könnte die Verschiebung erklären. Gruß K-H |
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. |
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. |
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: |
Re: Blockread mit Struktur hängt bei double
Hab ich das Problem auch, wenn ich einen FileStream zum lesen verwende, statt dem betagten blockread ?
|
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.
|
Re: Blockread mit Struktur hängt bei double
Zitat:
Delphi-Quellcode:
in der Typ-Deklaration sollte reichen.
packed record
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 19:04 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-2025 by Thomas Breitkreuz