![]() |
BlockRead und E/A Fehler 998 ...
Hallo,
ich habe schon die Suchfunktion des Forums hier befragt und auch schon Antworten finden können. Allerdings scheinen diese aber auf ganz anderer Weise zu funktionieren. Wenn ich folgenden Code verwende, bekomme ich entweder den Fehler 998 oder die Ausnahme, das hinter dem Dateizeiger gelesen wird:
Delphi-Quellcode:
es handelt sich um eine binär-Datei.
type
TOpCode = (lit,opr,lod,sto,cal,int,jmp,jpc,wri); Instruction = packed record f: TOpCode; // command l: Byte; // level a: Integer; // address end; TInstructions = Array of Instruction; PInstructions = ^TInstructions; var Instructions : PInstructions; var inFile: File; procedure foo(filename: String); var FSize: Integer; begin AssignFile(inFile,filename); FileMode := 0; Reset(inFile,1); FSize := FileSize(inFile); GetMem(Instructions,FSize); BlockRead(inFile,Instructions^[0],FSize); <--- i/o error 998 //BlockRead(inFile,Instructions, FSize); <--- read behind file ... FreeMem(Instructions,FSize); end; kann da Einer (oder Mehrere) sachdienliche Hinweise geben ? |
AW: BlockRead und E/A Fehler 998 ...
Das ist ein dynamisches Array.
Warum setzt niemand dessen Größe, um Speicher für die Felder zu reservieren? SetLength mit Dateigröße durch RecordGröße |
AW: BlockRead und E/A Fehler 998 ...
ist denn GetMem nicht mehr verwendbar ?
|
AW: BlockRead und E/A Fehler 998 ...
Zitat:
Delphi-Quellcode:
oder (besser) vergiss diese uralten File-Funktionen und verwende TFileStream.
inFile : File of Byte;
|
AW: BlockRead und E/A Fehler 998 ...
Warum übergibst du denn in Reset eine Strukturgröße von 1, wenn deine Struktur überhaupt nicht 1 Byte groß ist?
|
AW: BlockRead und E/A Fehler 998 ...
Zitat:
|
AW: BlockRead und E/A Fehler 998 ...
GetMem erzeugt nur die Variable für deinen Zeiger (PInstructions).
Da drin ist aber dann das "Array of" und dessen Größe wird mit SetLength reserviert, wie bei jeder anderen Variable auch. Dagegen, ein Zeiger auf ein statisches Array [0..0] oder [0..ganzgroß] da kann man mit GetMem genug Speicher reservieren, für alle Felder, die von diesem Array benutzt werden. |
AW: BlockRead und E/A Fehler 998 ...
Delphi-Quellcode:
Ergebnis: mem: 42 xxx
var fsize: Integer;
var bcFile: File of Byte; var buffer: Array of Byte; AssignFile(bcFile,s); FileMode := 0; // read only {$I-} Reset(bcFile); {$I+} if IOResult <> 0 then begin Application.MessageBox('Datei konnnte nicht geöffnet werden!', 'Visuanalyse', 48) ; exit; end; FSize := FileSize(bcFile); SetLength(buffer,FSize); ShowMessage('mem: ' + IntToStr(FSize)); BlockRead(bcFile,buffer,FSize); ShowMessage('xxx'); wie bringe ich nun buffer nach den "Instructions record ? |
AW: BlockRead und E/A Fehler 998 ...
Warum immer wieder neue Threads, zum selben Problem?
![]() ![]() ![]() Mach endlich die Speicherverwaltung dieses dämlichen Arrays richtig und fertig. Es versteht sowieso keiner, warum das auch nochmal in einem Pointer zu speichern, obwohl dynamische Arrays intern bereits ein Pointer sind. Oder alternativ einen Zeiger auf einen statischen Record zu benutzen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:06 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