Problem z przypisaniem wartości do tablicy (unsigned array of array)

0

Witam, mam problem z przypisaniem wartości do tablicy, którą przekazałem do procedury. Troszkę się nad tym głowię, ale na razie nic nie wymyśliłem. Może ktoś pomóc?
Z góry dziękuję.

Kod programu:

program pytanieTablica;
uses
        crt,UTypes;

var
        N:integer;
        TabPoints:TPoints;

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
        for  i:=0 to N do
        begin
                TabPoints[i,0]:=random(2);
                TabPoints[i,1]:=random(2);
        end;
end;

begin
        clrscr;
        ReadN(N);
        RandomizingPointsCoordinates(N,TabPoints);
        repeat until keypressed;
end.

Kod UTypes:

unit UTypes;

interface

//------------------------------------------------------------------------------
// Definicje typów danych
//------------------------------------------------------------------------------
type
  TPoint = array[0..1] of Real;
  TPoints = array of TPoint;
  TRoad = array of Integer;

implementation

end.
  1. Korzystam z najnowszego FreePascal-a.

  2. Problem tkwi (a przynajmniej tak mi się wydaje) w tym, w jaki sposób próbuję do konkretnych pól tablicy przypisać losowe wartości. Ponieważ komentując for-a w procedurze RandomizingPointsCoordinates wszystko działa.

  3. Na koniec chyba najważniejsza informacja, po skompilowaniu i uruchomieniu programu, kiedy podaję dowolne N (np. 5) dostaję "exitcode 201"

Any ideas?

0

Jeśli palnę głupotę to przepraszam, ale czy w Pascalu nie jest przypadkiem tak, że nie można zrobić tablicy o niezdefiniowanej uprzednio liczbie elementów? Tzn. czy przypadkiem nie musisz podać konkretnej wartości elementów tablicy? Bo jeśli się nie mylę to to prędzej będzie do zrealizowania na strukturach dynamicznych.

EDIT: Dziękuję za wyprowadzenie mnie z błędu, być może mi się to przyda :)

0

Odpowiedź jest prosta:
Nigdzie nie ustawiasz wymiarów tablicy.

SetLength
0

Z tego co wyczytałem tutaj: http://www.freepascal.org/docs-html/ref/refsu15.html
oraz wywnioskowałem z treści zadania (plik UTypes został mi dostarczony, nie mogę zmienić typów danych), to nie tylko może, a musi być to tablica o nieokreślonej wielkości.
Na tyle, ile pozwala mi mój skromny angielski, wygląda na to, że Free Pascal pozwala na stosowanie takich typów. Prawdopodobnie Turbo Pascal w wersji wyższej niż 6.0, również.

0

FPC pozwala na tablice dynamiczne.
W Turbo Pascalu z tego, co pamiętam trzeba było się nieźle namęczyć, aby takową zrobić.

0

@Patryk27 - problem w tym, że nawet po dodaniu na początku procedury: setlength(TabPoints,N);
nadal otrzymuję exitcode 201. Właśnie to mnie niepokoi. Jeśli mógłbyś, proszę. Sprawdź czy u Ciebie działa. Ewentualnie wklej tutaj kod w postaci takiej, jak u Ciebie. Byłbym na prawdę wdzięczny bo kończy mi się czas. :P

0

Rozumiem, że zrobiłeś tak:

        ReadN(N);
SetLength(TabPoints, N+1); //dla bezpieczeństwa osobiście zawsze dodaję jeden element więcej
        RandomizingPointsCoordinates(N,TabPoints);

Poza tym brakuje randomize.

0

Cały kod programu (bez reszty nieważnych elementów :P ):

program niewazne;
uses
	crt,UTypes;
type
	matrix=array of array of real;
var
	N:integer;
	TabPoints:TPoints;
	TabOfDistance:matrix;

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
	setlength(TabPoints,N);
	for  i:=0 to N do
	begin
		TabPoints[i,0]:=random;
		TabPoints[i,1]:=random;
	end;
end;

begin
	clrscr;
	ReadN(N);
	RandomizingPointsCoordinates(N,TabPoints);
	repeat until keypressed;
end.
1

SetLength(TabPoints, N+1)
I już działa.

2
artikow napisał(a)

@Patryk27 - problem w tym, że nawet po dodaniu na początku procedury: setlength(TabPoints,N);

W takiej sytuacji elementy tablicy indeksujesz w zakresie 0..(N-1)

0

Jesteś bogiem. Będę Ci dzisiaj składał pokłony. :D
Rozumiem, że chodziło o pierwszy element tablicy (z indeksem 0)? Nie brałem go tak jakby pod uwagę i stąd te problemy? Popraw mnie, jeśli się mylę. :P

I jeszcze raz dziękuję. ;)

1

//dla bezpieczeństwa osobiście zawsze dodaję jeden element więcej
czyli przestajesz dbać o to, czy elementów jest tyle ile jest, czy o jeden więcej, czy o jeden mniej… zamiast się raz zastanowić i potem wiedzieć ile ich NA PEWNO jest.

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