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)

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