Problem z procedurą BlockWrite. ExitCode 102. [FreePascal]

0

Witam, mam problem z zapisem tablic do pliku.

program foo;
uses
	crt;
type
	TRoad = array of Integer;

var
	N,Number:integer;

procedure Iniciate(N:integer; Number:integer);
var
	TempRoad:TRoad;
	i,k:integer;
	CurrentFile:file;
begin
	setlength(TempRoad,N);
	rewrite(CurrentFile,sizeof(TempRoad));
	assign(CurrentFile,'CurrentFile.gen');
	for i:=0 to Number do
	begin
		for k:=0 to N-1 do
			TempRoad[k]:=k;
		BlockWrite(CurrentFile,TempRoad,sizeof(TempRoad));
	end;
	close(CurrentFile);
end;

begin
	clrscr;
	N:=10;
	Number:=5;
	Iniciate(N,Number);
end.

Mógłby ktoś podpowiedzieć gdzie jest błąd? Ewentualnie jak to powinno wyglądać?
Z góry dziękuję i pozdrawiam!

0

Próbowałem też w ten sposób:

program foo;
uses
	crt;
type
	TRoad = array of Integer;

var
	N,Number:integer;

procedure Iniciate(N:integer; Number:integer);
var
	TempRoad:TRoad;
	i,k:integer;
	CurrentFile:file of TRoad;
begin
	setlength(TempRoad,N);
	rewrite(CurrentFile);
	assign(CurrentFile,'CurrentFile.gen');
	for i:=0 to Number do
	begin
		for k:=0 to N-1 do
			TempRoad[k]:=k;
		write(CurrentFile,TempRoad);
	end;
	close(CurrentFile);
end;

begin
	clrscr;
	N:=10;
	Number:=5;
	Iniciate(N,Number);
end.

Ale wciąż ten sam błąd. Może ktoś pomóc?

Ogólnie chodzi mi o to, żeby kolejno do pliku zapisywać tablicy TemRoad (z różnymi wartościami, ale tutaj będą miały kolejne wartości od 0 do k, ale to nie ważne). A potem chciałbym je odczytywać po kolei (całe tablice). Ale za czytanie się nawet nie biorę, póki nie zapisuję poprawnie... :/

1

a masz pojęcie co ty robisz ?
rewrite(CurrentFile,sizeof(TempRoad));
assign(CurrentFile,'CurrentFile.gen');

to na odwrót liniami powinno być !

1

Jak napisał kolega wyżej - ten kod:

rewrite(CurrentFile,sizeof(TempRoad));
assign(CurrentFile,'CurrentFile.gen');

Jest błędny.
Najpierw należy otworzyć plik, a potem dopiero ustawić go do zapisu.

0

Tak, wiem. Już tłumaczę. :P
Otóż męczę się z tym już dłuższy czas i przeczesuję internet w poszukiwaniu rozwiązania. Wiem, że najpierw należy powiązać zmienną z plikiem, a dopiero go otworzyć i cokolwiek na nim/niej wykonywać. Aczkolwiek gdzieś znalazłem (podobno działający) przykład zapisu do pliku i było to zapisane w ten sposób co w podanym przeze mnie kodzie. W akcie desperacji spróbowałem to w ten sposób zapisać. Co oczywiście nic nie dało. Z resztą, w tym momencie zamiana miejscami również nic nie daje. Cały czas ten sam błąd ExitCode 102.
Przez nieuwagę po prostu nie zmieniłem z powrotem, tak jak powinno być. :)

0

102 : File not assigned (Plik nie został powiązany ze zmienną plikowa)

może daj 'C:\CurrentFile.gen'

0

Pracuję pod Windowsem, ale tak jak napisał Patryk27, to nie powinno mieć wpływu. W innych przypadkach działa poprawnie. Jakieś inne pomysły?

0

for k:=0 to N-1 do
TempRoad[k]:=k;

Tak, jasne, najpierw to zapisujesz do arraya, a potem przepisujesz do innego arraya (na dodatek wielokrotnie) i zapisujesz. Dynamicznego arraya tak nie zapiszesz. Zapewne zapisujesz sam pointer na niego.

Masz dwa wyjścia:

  1. file of integer; + Write
  2. file of boolean{koniecznie, samo file nie działa z blockwrite} + BlockWrite
0

to tak ja zrobiłem to w Delphi 7 to mi działało u cb w tym fpc zobacz czy to będzie ci działać

 
var
  N,Number:integer;
  TempRoad : array of Integer;

 
procedure Iniciate(N:integer; Number:integer);
var
        i,k:integer;
        CurrentFile:file of Integer;
begin
        setlength(TempRoad,N);
        assign(CurrentFile,'C:\CurrentFile.gen');
        rewrite(CurrentFile);

        for i:=0 to Number do
        begin
                for k:=0 to N-1 do  TempRoad[k]:=k;
                BlockWrite(CurrentFile,TempRoad,sizeof(TempRoad));
        end;
        close(CurrentFile);
end;

begin
        N:=10;
        Number:=5;
        Iniciate(N,Number);
end;

zamiast

type
        TRoad = array of Integer;

jest w var to

  TempRoad : array of Integer; 
0
NieSynaptyczny napisał(a)

for k:=0 to N-1 do
TempRoad[k]:=k;

Tak, jasne, najpierw to zapisujesz do arraya, a potem przepisujesz do innego arraya (na dodatek wielokrotnie) i zapisujesz. Dynamicznego arraya tak nie zapiszesz. Zapewne zapisujesz sam pointer na niego.

Masz dwa wyjścia:

  1. file of integer; + Write
  2. file of boolean{koniecznie, samo file nie działa z blockwrite} + BlockWrite

mylisz się on Number razy powtarza czynność wklejania do tablicy k razy element k (TempRoad[k]:=k;) i zapisuje tablice do pliku

1

@proqix:
Ja nie wiem czy ty jesteś uświadomiony że zapisujesz pointery na arraya, bo sizeof(dynamic_array) daje rozmiar pointera...
I nie rozumiem celu zagłębionego fora, coś tam jest ewidentnie skopane...

Dynamic array zapisuje się tak:

BlockWrite(plik,array[0],sizeof(array[0])*length(array));
0

Dobra, rozwiązałem problem w inny sposób, tak jak zasugerował proqix (a przynajmniej wydaje mi się, że o to mu chodziło). Musze się jeszcze sporo nauczyć i poczytać więcej o pointerach i o zapisie i odczycie z plików. Tymczasowe rozwiązanie:

program foo;
uses
	crt;
type
	TRoad = array of Integer;

var
	N,Number:integer;

procedure Zapis(N:integer; Number:integer);
var
	TempRoad:TRoad;
	i,k:integer;
	CurrentFile:file of integer;
begin
	randomize;
	assign(CurrentFile,'CurrentFile.gen');
	rewrite(CurrentFile);
	setlength(TempRoad,N);
	for i:=0 to Number do
	begin
		for k:=0 to N-1 do
			TempRoad[k]:=random(N);
		for k:=0 to N-1 do
			write(CurrentFile,TempRoad[k]);
	end;
	close(CurrentFile);
end;

procedure Odczyt(N:integer; Number:integer);
var
	TempRoad:TRoad;
	i,k:integer;
	CurrentFile:file of integer;
begin
	randomize;
	assign(CurrentFile,'CurrentFile.gen');
	reset(CurrentFile);
	setlength(TempRoad,N);
	for i:=0 to Number do
	begin
		for k:=0 to N-1 do
			read(CurrentFile,TempRoad[k]);
		for k:=0 to N-1 do
			write(TempRoad[k],' ');
		writeln;
	end;
	close(CurrentFile);
end;

begin
	clrscr;
	N:=10;
	Number:=3;
	Zapis(N,Number);
	Odczyt(N,Number);
	repeat until keypressed;
end.

Dziękuję wszystkim za sugestię i pomoc. Pozdrawiam!!!

1 użytkowników online, w tym zalogowanych: 0, gości: 1