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

Problem z procedurą BlockWrite. ExitCode 102. [FreePascal]
AR
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 11 lat
  • Postów:25
0

Witam, mam problem z zapisem tablic do pliku.

Kopiuj
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!

AR
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 11 lat
  • Postów:25
0

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

Kopiuj
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... :/

edytowany 1x, ostatnio: artikow
PR
  • Rejestracja:około 16 lat
  • Ostatnio:ponad 9 lat
  • Postów:304
1

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

to na odwrót liniami powinno być !


CodeGear Delphi 2007 | Windows 7 |
Jak to dobrze że istnieje opcja edytuj post ;]
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
1

Jak napisał kolega wyżej - ten kod:

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

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


edytowany 1x, ostatnio: Patryk27
AR
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 11 lat
  • Postów:25
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ć. :)

edytowany 2x, ostatnio: artikow
PR
  • Rejestracja:około 16 lat
  • Ostatnio:ponad 9 lat
  • Postów:304
0

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

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


CodeGear Delphi 2007 | Windows 7 |
Jak to dobrze że istnieje opcja edytuj post ;]
edytowany 1x, ostatnio: proqix
Patryk27
Nie sądzę, aby to coś zmieniło. Jeżeli napiszesz po prostu nazwę pliku, to system powinien szukać jej w katalogu z programem. Poza tym nie masz pewności, czy on pracuje na Windowsie.
AR
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 11 lat
  • Postów:25
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
AR
Czyli przy dynamicznych tablicach, nie da rady zapisywać ich w całości do pliku? Czy może źle zrozumiałem?
PR
  • Rejestracja:około 16 lat
  • Ostatnio:ponad 9 lat
  • Postów:304
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ć

Kopiuj
 
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

Kopiuj
type
        TRoad = array of Integer;

jest w var to

Kopiuj
  TempRoad : array of Integer; 

CodeGear Delphi 2007 | Windows 7 |
Jak to dobrze że istnieje opcja edytuj post ;]
edytowany 1x, ostatnio: proqix
PR
  • Rejestracja:około 16 lat
  • Ostatnio:ponad 9 lat
  • Postów:304
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


CodeGear Delphi 2007 | Windows 7 |
Jak to dobrze że istnieje opcja edytuj post ;]
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:

Kopiuj
BlockWrite(plik,array[0],sizeof(array[0])*length(array));
AR
Akurat ten zagłębiony for jest najmniej ważny. Po prostu wypełnia tablicę TempRoad kolejnymi wartościami (od 0 do N-1), żeby nie zapisywać pustych tablic do pliku. Nie jest on problemem, można go spokojnie usunąć. Mnie chodzi o sam zapis. Spróbuję wykorzystać wasze rady.
AR
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 11 lat
  • Postów:25
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:

Kopiuj
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!!!

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.