AGB  ·  Datenschutz  ·  Impressum  







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

BlockRead und E/A Fehler 998 ...

Ein Thema von paule32.jk · begonnen am 20. Okt 2023 · letzter Beitrag vom 22. Okt 2023
Antwort Antwort
Benutzerbild von paule32.jk
paule32.jk

Registriert seit: 24. Sep 2022
Ort: Planet Erde
356 Beiträge
 
Delphi 11 Alexandria
 
#1

BlockRead und E/A Fehler 998 ...

  Alt 20. Okt 2023, 14:58
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 ?
Frag doch einfach
Alles was nicht programmiert werden kann, wird gelötet
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

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

  Alt 20. Okt 2023, 15:29
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
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von paule32.jk
paule32.jk

Registriert seit: 24. Sep 2022
Ort: Planet Erde
356 Beiträge
 
Delphi 11 Alexandria
 
#3

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

  Alt 20. Okt 2023, 15:33
ist denn GetMem nicht mehr verwendbar ?
Frag doch einfach
Alles was nicht programmiert werden kann, wird gelötet
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
701 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 20. Okt 2023, 15:35
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

inFile : File of Byte; oder (besser) vergiss diese uralten File-Funktionen und verwende TFileStream.
Peter Below
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#5

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

  Alt 20. Okt 2023, 15:46
Warum übergibst du denn in Reset eine Strukturgröße von 1, wenn deine Struktur überhaupt nicht 1 Byte groß ist?
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.452 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 20. Okt 2023, 15:53
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

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

  Alt 20. Okt 2023, 16:06
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von paule32.jk
paule32.jk

Registriert seit: 24. Sep 2022
Ort: Planet Erde
356 Beiträge
 
Delphi 11 Alexandria
 
#8

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

  Alt 20. Okt 2023, 16:32
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 ?
Frag doch einfach
Alles was nicht programmiert werden kann, wird gelötet

Geändert von paule32.jk (20. Okt 2023 um 18:03 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

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

  Alt 22. Okt 2023, 11:32
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (22. Okt 2023 um 11:47 Uhr)
  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 01:51 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