Błąd 201 w programie

Odpowiedz Nowy wątek
2006-09-30 15:10
koszcz
0
var cout,x,y,pa,ba:integer;
    i,d,a,b:integer;
    l,t:integer;
    tab:array of array of boolean;

begin
l:=1;
t:=-1;
readln(d);
cout:=1;
for i:=1 to d do
begin

  readln(x,y,a,b);
  pa:=a;
  ba:=b;

  repeat

    if ((b+t)>y) or ((b+t)<0) then t:=-t;
    if ((a+l)>x) or ((a+l)<0) then l:=-l;

    a:=a+l;
    b:=b+t;

    if tab[a,b]=false then
    begin
     tab[a,b]:=true;
     cout:=cout+1;
    end else
    begin
     tab[a,b]:=false;
     cout:=cout-1;
    end;

  until (pa=a) and (ba=b);
  writeln(cout);

end;
end.

Witam, powyższy program kompiluje się bezbłędnie. Najpierw pobiera liczbę zestawów danych, a w następnych linijkach wczytuje zestawy danych po cztery liczby (co on robi to już inna sprawa). Po wpisaniu pierwszego zestawu danych program wyświetla błąd 201 (chyba każdy wie co on oznacza), a dokładniej przy linijce " if tab[a,b]=false then ". Czy ktoś mógłby mi pomóc?

Pozostało 580 znaków

2006-09-30 15:14
0

najpierw przydałoby się nadać rozmiar tej tabeli setlength dla tablicy a potem dla każdego jej wiersza


Dwie zasady gwarantujące sukces:
1. Nigdy nie mów nikomu wszystkiego<span style="color: white">

Pozostało 580 znaków

2006-09-30 16:04
koszcz
0
var cout,x,y,pa,ba:integer;
    i,d,a,b:integer;
    l,t:integer;
    tab:array of array of boolean;

begin
l:=1;
t:=-1;
readln(d);
for i:=1 to d do
begin

  readln(x,y,a,b);
  pa:=a;
  ba:=b;

  setlength(tab,x);
  for cout:=1 to x do setlength(tab[cout],y);
  cout:=1;

  repeat

    if ((b+t)>y) or ((b+t)<0) then t:=-t;
    if ((a+l)>x) or ((a+l)<0) then l:=-l;

    a:=a+l;
    b:=b+t;

    if tab[a,b]=false then
    begin
     tab[a,b]:=true;
     cout:=cout+1;
    end else
    begin
     tab[a,b]:=false;
     cout:=cout-1;
    end;

  until (pa=a) and (ba=b);
  writeln(cout);

end;
end.

To nie pomogło. Co może być przyczyną tego błędu? Zastanawiam się nad tym od paru ładnych godzin.

Pozostało 580 znaków

2006-09-30 17:37
0

numerowane jest od zera więc nie
for cout := 1 to x
tylko
for cout := 0 to x - 1
i dalej podobnie


Dwie zasady gwarantujące sukces:
1. Nigdy nie mów nikomu wszystkiego<span style="color: white">

Pozostało 580 znaków

2006-09-30 18:58
koszcz
0

Ups, rzeczywiście błąd, ale niestety nadal to samo.

Błąd sprowadza się do wyrażenia tab[a,b]=false, indeksami są liczby typu integer, a dane w nich zachowane to wartości logiczne, więc jakim sposobem w tym wyrażeniu zachodzi "Range check error"?

Wg. specyfikacji są dwie możliwości:

  1. An array was accessed with an index outside its declared range.
  2. Trying to assign a value to a variable outside its range (for instance an enumerated type).

Może się myle, ale ja żadnego z tych błędów nie znalazłem w moim programie :(

Pozostało 580 znaków

2006-09-30 19:46
koszcz
0

Sory za podwójny post ale nie mam możliwości edycji poprzedniego.

Okazało się że program zatrzymuje się już na linijce

for cout:=1 to x do setlength(tab[cout],y);

Pozostało 580 znaków

2006-09-30 20:55
0

Przecież napisał ci Adamo wyżej, że ma być

for cout:=0 to x-1 do setlength(tab[cout],y);

Pozostało 580 znaków

2006-10-01 10:35
0

Też nie pomaga

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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