Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   BlockRead und E/A Fehler 998 ... (https://www.delphipraxis.net/213929-blockread-und-e-fehler-998-a.html)

paule32.jk 20. Okt 2023 13:58

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:
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;
es handelt sich um eine binär-Datei.
kann da Einer (oder Mehrere) sachdienliche Hinweise geben ?

himitsu 20. Okt 2023 14:29

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

paule32.jk 20. Okt 2023 14:33

AW: BlockRead und E/A Fehler 998 ...
 
ist denn GetMem nicht mehr verwendbar ?

peterbelow 20. Okt 2023 14:35

AW: BlockRead und E/A Fehler 998 ...
 
Zitat:

Zitat von paule32.jk (Beitrag 1528429)
var
inFile: File;

Dein file ist kein file of byte (Blocksize = 1) sondern benutzt als default eine Blocksize von 128 wenn mich mein Vergessnis nicht täuscht. Also definiere inFile entweder als

Delphi-Quellcode:
inFile : File of Byte;
oder (besser) vergiss diese uralten File-Funktionen und verwende TFileStream.

jaenicke 20. Okt 2023 14:46

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?

Uwe Raabe 20. Okt 2023 14:53

AW: BlockRead und E/A Fehler 998 ...
 
Zitat:

Zitat von peterbelow (Beitrag 1528443)
Dein file ist kein file of byte (Blocksize = 1) sondern benutzt als default eine Blocksize von 128 wenn mich mein Vergessnis nicht täuscht.

Bei einem untypisierten File wird die Blockgröße im Reset angebeben und da steht eine 1.

himitsu 20. Okt 2023 15:06

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.

paule32.jk 20. Okt 2023 15:32

AW: BlockRead und E/A Fehler 998 ...
 
Delphi-Quellcode:
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');
Ergebnis: mem: 42 xxx

wie bringe ich nun buffer nach den "Instructions record ?

himitsu 22. Okt 2023 10:32

AW: BlockRead und E/A Fehler 998 ...
 
Warum immer wieder neue Threads, zum selben Problem?
https://www.delphipraxis.net/213934-...ppt-nicht.html
https://www.delphipraxis.net/213935-...-new-post.html
https://www.delphipraxis.net/213937-...-new-post.html

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 05:22 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