[delphi] BlockRead wil niet lukken

Pagina: 1
Acties:
  • 112 views sinds 30-01-2008
  • Reageer

  • Darkvater
  • Registratie: Januari 2001
  • Laatst online: 26-08-2024

Darkvater

oh really?

Topicstarter
Kijk naar de volgende code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure TForm1.FormCreate(Sender: TObject);
type
  FirstLine = record
    LastLineRec: integer;
    NumSys: integer;
  end;
var
  F: file;
  Buf: FirstLine;
begin
if OpenDialog1.Execute then
  AssignFile(F, OpenDialog1.FileName);
  Reset(F, 84);
  BlockRead(F, Buf, 1);
  Canvas.TextOut(5,10,'Sys: ' + IntToStr(Buf.LastLineRec) + ' LastLine: ' + IntToStr(Buf.NumSys));
  CloseFile(F);
end;

Dit is alleen een simpele form met niks erop. Het maakt niet uit welke file ik open, aan het einde (dus bij end;) krijg ik het volgende message: "Project1.exe faulted with message: 'access violation at 0.....: read of address 0..... Process Stopped'

What de fuck is dit? En dit gebeurt niet alleen op mijn pc, maar op alle pc's die ik geprobeerd heb!! Help me alsjeblieft!!


Windows Vista? *NEVER* Het waarom - Opera forever!!!
I've seen chickens that were more menacing. Chickens in a coma. On ice. In my fridge


Verwijderd

Wat dacht je van debug lines toe te voegen?
Denk dat je eerst maar moeten leren je eigen code te debuggen voordat je hier komt.

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
wat dacht je ervan om een code-tag te gebruiken?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TForm1.FormCreate(Sender: TObject);
type
  FirstLine = record
    LastLineRec: integer;
    NumSys: integer;
  end;
var
  F: file;
  Buf: FirstLine;
begin
  if OpenDialog1.Execute then
    AssignFile(F, OpenDialog1.FileName);
  Reset(F, 84);
  BlockRead(F, Buf, 1);
  Canvas.TextOut(5,10,'Sys: ' + IntToStr(Buf.LastLineRec)
    + ' LastLine: ' + IntToStr(Buf.NumSys));
  CloseFile(F);
end;

  • Darkvater
  • Registratie: Januari 2001
  • Laatst online: 26-08-2024

Darkvater

oh really?

Topicstarter
Ja, sorry ik wist niet precies hoe de code werkt, maar dus zo. Maar heeft iemand een idee? Het loopt vast zodra er uit de functie is gekomen.


Windows Vista? *NEVER* Het waarom - Opera forever!!!
I've seen chickens that were more menacing. Chickens in a coma. On ice. In my fridge


  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Op zondag 07 oktober 2001 11:51 schreef Angel het volgende:
Wat dacht je van debug lines toe te voegen?
Denk dat je eerst maar moeten leren je eigen code te debuggen voordat je hier komt.
oftewel: breakpoints toevoegen, en debuggen maar :) suc6

Verwijderd

Je wilt 84*1 = 84 bytes inlezen, terwijl je plaats hebt voor 8 bytes, da ga nie goet

Oplossing: Lees 8 bytes in :)

vb
code:
1
2
Reset(F, 8);
BlockRead(F, Buf, 1);

of
code:
1
2
Reset(F, 1);
BlockRead(F, Buf, 8);

of
code:
1
2
Reset(F, 2);
BlockRead(F, Buf, 4);

of
code:
1
2
Reset(F, 4);
BlockRead(F, Buf, 2);

  • Darkvater
  • Registratie: Januari 2001
  • Laatst online: 26-08-2024

Darkvater

oh really?

Topicstarter
Op zondag 07 oktober 2001 14:38 schreef DiFool het volgende:
Je wilt 84*1 = 84 bytes inlezen, terwijl je plaats hebt voor 8 bytes, da ga nie goet

Oplossing: Lees 8 bytes in :)

of... of... of...
Verrek, daar heb ik niet aan gedacht om het zo te doen!! Maar ik moet zowiezo 84 inlezen want mijn andere records zijn zo groot (het hele programma is eigenlijk een rewrite van Fortran :'( waar die dingen in 84 bytes zijn.

Voor de mensen boven jou: denk je dat ik niet heb gedebugged? Ik ben 3 dagen al bezig met dit stomme ding. Maar dank je DiFool, ik zal het proberen!!


Windows Vista? *NEVER* Het waarom - Opera forever!!!
I've seen chickens that were more menacing. Chickens in a coma. On ice. In my fridge


Verwijderd

eh misschien
code:
1
2
3
var
  Buffer1: array[0..83] of Char;
  Buffer2: array[0..20] of Integer;

Allebei precies 84 bytes

  • Darkvater
  • Registratie: Januari 2001
  • Laatst online: 26-08-2024

Darkvater

oh really?

Topicstarter
Jah, bedankt DiFool!! (al bij je vorige met 8 bytes). Ik heb gewoon aan de FirstLine een character type toegevoegd van 76 bytes
code:
1
2
3
4
5
Firstline = record
  LastLineRec: integer;
  NumSys: integer;
  NOthing: array[1..76] of char;
end;

Nu doet ie het perfect!! Het echte probleem was dat de eerste record er zo uitziet (en dus maar 8 bytes gebruikt), terwijl alle volgende records de volledige 84 bytes gebruiken. Kennelijk vond Delphi het niet zo goed dat bij de eerste inlezing met de resterende 76 bytes niks werd gedaan en liep aan het einde vast. Dank U zeer Afbeeldingslocatie: http://www.farago.f2s.com/stuff/worshippy.gif


Windows Vista? *NEVER* Het waarom - Opera forever!!!
I've seen chickens that were more menacing. Chickens in a coma. On ice. In my fridge


Verwijderd

Probleem is dat je 8 bytes geheugen gealloceerd had [record met 2 integers], je geeft het adres van die allocatie door [dmv var Buffer] en zegt dat hij vanaf daar 84 bytes mag vullen, wat Delphi dan ook vrolijk doet; dan gaat Windows bij byte 9 huilen dat je op een geheugenlokatie zit te schrijven waar je geen toegang tot hebt [aka Access violation].

Het rare vind ik wel dat de melding pas na de CloseFile komt, maar dat is volgens mij compiler magic van Delphi, met als doel dat het bestand altijd gesloten wordt.
Pagina: 1