Dwa błędy w sporym programie.

Dwa błędy w sporym programie.
AR
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 11 lat
  • Postów:25
0

Witam, piszę właśnie projekt. Niestety natrafiłem (znowu) na błędy, których sam nie potrafię zlokalizować i naprawić. Prosiłbym o pomoc, jeśli to możliwe. Wiem, że program jest chaotyczny i niezbyt zgrabny, ale ważne, żeby działał...

Dwa problemy:

  1. W procedurze iniciate zawsze wczytuje ostatni element pliku do zmiennej BestWay. Nie pomaga ustawienie wskaźnika pliku na pierwszym elemencie
Kopiuj
seek(CurrentGenerationFile,0);
  1. W procedurze SeekBestWay jest jakiś błąd, który powoduje zakończenie programu z exitcode 204, czyli z tego co wyczytałem, przekroczenie pojemności zmiennej. Ale szczerze mówiąc, nie wiem co tam może być źle.
Kopiuj
program projekt;
uses
	crt,UTypes;
type
	matrix=array of array of real;
var
	N:integer;
	TabPoints:TPoints;
	TabOfDistance:matrix;
	BestWay:TRoad;
	LengthOfBestWay,TemporaryLength:real;
	TempRoad:TRoad;

procedure ReadN(var N:integer);
var
	key:char;
begin
	repeat
		write('Podaj ilosc punktow (N): ');
		read(N);
		if (N<=0) then
		begin
			clrscr;
			write('N musi byc wieksze od 0! [d - dalej]: ');
			repeat
				key:=readkey;
			until (key='d');
			clrscr;
		end;
	until (N>0);
end;

procedure RandomizingPointsCoordinates(N:integer; var TabPoints:TPoints);
var
	i:integer;
begin
	randomize;
	setlength(TabPoints,N);
	for  i:=0 to N-1 do
	begin
		TabPoints[i,0]:=random(99)+random;
		TabPoints[i,1]:=random(99)+random;
	end;
end;

procedure CreatingArrayOfDistance(N:integer; TabPoints:TPoints; var TabOfDistance:matrix);
var
	i,k:integer;
begin
	setlength(TabOfDistance,N,N);
	for i:=0 to N-1 do
		for k:=0 to N-1 do
			TabOfDistance[i,k]:=sqrt(sqr(TabPoints[i,0]-TabPoints[k,0])+sqr(TabPoints[i,1]-TabPoints[k,1]));
end;

procedure SavePointsCooridnates(N:integer; TabPoints:TPoints);
var
	i,k:integer;
	key:char;
	PointsCoordinatesFile:text;
begin
	clrscr;
	write('Czy chcesz zapisac wspolrzedne punktow do pliku? [t/n]: ');
	repeat
		key:=readkey;
	until (key='t') or (key='n');
	if key='t' then
	begin
		assign(PointsCoordinatesFile,'PointsCoordinates.txt');
		rewrite(PointsCoordinatesFile);
		for i:=0 to N-1 do
			writeln(PointsCoordinatesFile,i,'. x=',TabPoints[i,0]:0:2,' y=',TabPoints[i,1]:0:3);
		close(PointsCoordinatesFile);
	end;
	clrscr;
end;

procedure SaveArrayOfDistance(N:integer; TabOfDistance:matrix);
var
	i,k:integer;
	ArrayOfDistanceFile:text;
	key:char;
begin
	write('Czy chcesz zapisac tablice odleglosci do pliku? [t/n]: ');
	repeat
		key:=readkey;
	until (key='t') or (key='n');
	if key='t' then
	begin
		assign(ArrayOfDistanceFile,'ArrayOfDistance.txt');
		rewrite(ArrayOfDistanceFile);
		write(ArrayOfDistanceFile,'     ');
		for i:=0 to N-1 do
			write(ArrayOfDistanceFile,' [',i,'] 	');
		writeln(ArrayOfDistanceFile,'');
		for i:=0 to N-1 do
		begin
			write(ArrayOfDistanceFile,' [',i,'] ');
			for k:=0 to N-1 do
			begin
				write(ArrayOfDistanceFile,TabOfDistance[i,k]:0:2,'	');
			end;
		writeln(ArrayOfDistanceFile,'');
		end;
		close(ArrayOfDistanceFile);
	end;
end;

//Zawsze odczytuje ostatni element pliku
procedure Iniciate(N:integer; var BestWay:TRoad; var LengthOfBestWay:real; var TemporaryLength:real; TabOfDistance:matrix);
var
	CurrentGenerationFile:file of TRoad;
	i:integer;
	plik:text;
	
begin
	assign(CurrentGenerationFile,'CurrentGeneration.gen');
	reset(CurrentGenerationFile);
	seek(CurrentGenerationFile,0);
	read(CurrentGenerationFile,BestWay);
	TemporaryLength:=0;
	for i:=1 to N-1 do
	begin
		TemporaryLength:=TemporaryLength+TabOfDistance[BestWay[i-1],BestWay[i]];
	end;
	LengthOfBestWay:=TemporaryLength;
	close(CurrentGenerationFile);
	assign(plik,'Iniciate.txt');
	rewrite(plik);
	writeln(plik,TemporaryLength:0:2);
	writeln(plik,'');
	for i:=0 to N-1 do
		write(plik,BestWay[i],' ');
	close(plik);
end;

procedure SeekBestWay(N:integer; var BestWay:TRoad; var LengthOfBestWay:real; var TemporaryLength:real; TabOfDistance:matrix; var TempRoad:TRoad);
var
	i:integer;
	CurrentGenerationFile:file of TRoad;
begin
	assign(CurrentGenerationFile,'CurrentGeneration.gen');
	reset(CurrentGenerationFile);
	while not eof(CurrentGenerationFile) do
	begin
		read(CurrentGenerationFile,TempRoad);
		TemporaryLength:=0;
		for i:=1 to N-1 do
		begin
			TemporaryLength:=TemporaryLength+TabOfDistance[TempRoad[i-1],TempRoad[i]];
		end;
		if TemporaryLength<LengthOfBestWay then
		begin
			LengthOfBestWay:=TemporaryLength;
			for i:=0 to N-1 do
				BestWay[i]:=TempRoad[i];
		end;
	end;
	close(CurrentGenerationFile);
end;

procedure CreatingFirstGeneration(N:integer; var TempRoad:TRoad);
var
	i,k,RandomValue,Temp,EndOfOperation:integer;
	CurrentGenerationFile:file of TRoad;
	CurrentGenerationTextFile:text;
begin
	setlength(TempRoad,N);
	if (N mod 2)=0 then
		EndOfOperation:=(N div 2)
	else
		EndOfOperation:=(N div 2)+1;
	assign(CurrentGenerationFile,'CurrentGeneration.gen');
	rewrite(CurrentGenerationFile);
	assign(CurrentGenerationTextFile,'Generations.txt');
	rewrite(CurrentGenerationTextfile);
	randomize;
	writeln(CurrentGenerationTextFile,'Generation: 1');
	writeln(CurrentGenerationTextFile,'');
	for i:=1 to EndOfOperation do
	begin
		for k:=0 to N-1 do
			TempRoad[k]:=k;
		for k:=0 to N-1 do
		begin
			RandomValue:=random(N-1);
			Temp:=TempRoad[RandomValue];
			TempRoad[RandomValue]:=TempRoad[N-1];
			TempRoad[N-1]:=Temp;	
		end;
		write(CurrentGenerationFile,TempRoad);
		for k:=0 to N-1 do
			write(CurrentGenerationTextFile,TempRoad[k],' ');
		writeln(CurrentGenerationTextFile,'');
	end;
	close(CurrentGenerationFile);
	close(CurrentGenerationTextFile);
end;

procedure result(N:integer; var BestWay:TRoad; LengthOfBestWay:real);
var
	i:integer;
	plik:text;
	
begin
	assign(plik,'Result.txt');
	rewrite(plik);
	writeln(plik,LengthOfBestWay:0:2);
	writeln(plik,'');
	for i:=0 to N-1 do
		write(plik,BestWay[i],' ');
	close(plik);
end;

begin
	clrscr;
	ReadN(N);
	RandomizingPointsCoordinates(N,TabPoints);
	CreatingArrayOfDistance(N,TabPoints,TabOfDistance);
	SavePointsCooridnates(N,TabPoints);
	SaveArrayOfDistance(N,TabOfDistance);
	CreatingFirstGeneration(N,TempRoad);
	Iniciate(N,BestWay,LengthOfBestWay,TemporaryLength,TabOfDistance);
	//SeekBestWay(N,BestWay,LengthOfBestWay,TemporaryLength,TabOfDistance,TempRoad); Nie działa! (???)
	result(N,BestWay,LengthOfBestWay);
end.

Jakby ktoś chciał uruchomić u siebie program, dołączam kod Utypes:

Kopiuj
unit UTypes;

interface

type
  TPoint = array[0..1] of Real;
  TPoints = array of TPoint;
  TRoad = array of Integer;

implementation

end.
Opi
  • Rejestracja:ponad 20 lat
  • Ostatnio:około 22 godziny
  • Postów:1030
0

Co to jest ?

Kopiuj
TabPoints[i,0]:=random(99)+random;
TabPoints[i,1]:=random(99)+random;
edytowany 1x, ostatnio: Opi
AR
Losuje do tablicy dowolną liczbę rzeczywistą. random(99) losuje liczbę całkowitą od 0 do 99, a random, z przedziału od 0 do 1. W prawdzie zamiast wklepanej na stałe liczby powinno być tam N, ale to mało ważne. Pisałem to na szybko i nie zastanawiałem się nad ładniejszym rozwiązaniem, a to działa tak jak należy.
AR
Głupio odpowiedziałem. Bo mogłeś się tego domyśleć. Przy pomocy tych dwóch linijek losuję współrzędne punktów, między którymi potem będę szukał najkrótszej drogi. Nie mam na nie wpływu bo mi to nie potrzebne. Mają być losowe.

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.