[Pascal] Program do rysowania figur i obliczania pola

0

Witam. Mam napisać w Pascalu (:/) program w którym w trybie tekstowym za pomocą "iksów" będzie można narysować figurę, a następnie wyświetli się jej obwód i pole. Pole rysowania jest ograniczone do 50 wierszy i 50 kolumn. Wszystko wydaję się być ok a jednak po narysowaniu figury wywala mnie pokazując exit code 201... Help pls :(

program pole;
uses CRT;
var a,b,pierwszy,drugi,f,k,x,y,i,p,w: Integer;
var wyb: Char;
var t: array [10..50,5..50] of Boolean;
var xD: array [10..50,5..50] of Boolean;
begin
clrscr;


  <i>{Rysowanie, Obwód}</i>

  x:=10;
  y:=5;
  a:=0;
  gotoXY(x,y);
  write('x');
  t[x,y]:=true;

  repeat
    repeat
      wyb:=readkey;
      wyb:=upcase(wyb);
    until (wyb='W') or (wyb='S') or (wyb='A') or (wyb='D');

    if wyb='W' then y:=y-1;
    if wyb='S' then y:=y+1;
    if wyb='A' then x:=x-1;
    if wyb='D' then x:=x+1;

   if x<10 then begin
   x:=10; a:=a-1; end;
   if x>50 then begin
   x:=50; a:=a-1; end;
   if y<5 then begin
   y:=5; a:=a-1;  end;
   if y>50 then begin
   y:=50; a:=a-1; end;


      gotoXY(x,y);
      write('x');
      t[x,y]:=true;
      a:=a+1;

   until (x=10) and (y=5);


  {Pole}

  k:=9;

  for w:=5 to 50 do begin <i>{wiersz}</i>

    repeat
    pierwszy:=0;
    drugi:=0;

    <i>{pierwsze przejście}</i>

    if k=9 then begin
      repeat
        k:=k+1;
        if t[k,w]=true then pierwszy:=k;
      until pierwszy=k;

      repeat
        k:=k+1;
        if (t[k,w]=true) and (t[k+1,w]=false) then drugi:=k;
      until drugi=k;

      for i:=pierwszy to drugi do xD[i,w]:=true;
    end;

    <i>{kolejne przejścia}</i>

    repeat
      k:=k+1;
      if t[k,w]=true then pierwszy:=k;
    until (pierwszy=k) or (k=50) or (k>50);

    repeat
      k:=k+1;
      if (t[k,w]=true) and (t[k+1,w]=false) then drugi:=k;
    until (drugi=k) or (k=50) or (k>50);

    for i:=pierwszy to drugi do xD[i,w]:=true;

    until (k=50) or (k>50);

  end;

  <i>{liczenie pola}</i>

  for i:=5 to 50 do begin
    for f:=10 to 50 do begin
      if xD[f,i]=true then p:=p+1;
    end;
  end;

gotoXY(10,3);
writeln('Obwód wynosi ',a,',a pole ',p);
readln;
end.
0

Sprawdziłem, skompilowałem. Nie zauważyłem żadnych błędów na poziomie kodu. Dostałem info, że zmienna P nie jest zainicjowana i b jest nieużywana, ale poprawiłem i nadal nic. Po wyłączeniu Range checka wywaliło mi błąd 216. Najprawdopodobniej powodem są błędy w założeniach i algorytmach. Pomyśl jak inaczej mógłbyś to napisać i zrób program jeszcze raz. Możesz też poszukać w kodzie błędów w których odnosisz się do zmiennej poza jej zakres, i chciałem się jeszcze spytać jak program ma liczyć pole ??

W FPC:
201 Range check error
If you compiled your program with range checking on, then you can get
this error in the following cases:

  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).

216 General Protection fault
The application tried to access invalid memory space. This can be
caused by several problems:

  1. Dereferencing a nil pointer.
  2. Trying to access memory which is out of bounds (for example, calling move with an
    invalid length).

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