Algorytm Flood Fill powoduje błąd "external SIGSEGV"

0

Witam, testuje ten algorytm na tablicy 2 wymiarowej. Kod podany poniżej:

Program project1;
uses crt;
var tab:array [1..10,1..10] of integer;
  y,x,a,b:integer;
  procedure init () ;
var i,j:integer;
begin
     for i:=1 to 10 do
     begin
       for j:=1 to 10 do
       begin
         tab[i,j]:=0;
       end;
     end;
end;

procedure show ();
var i,j:integer;
  begin
      for i:=1 to 10 do
     begin
       for j:=1 to 10 do
       begin
         if tab[i,j]= 9 then
         TextColor(12);
         write(tab[i,j],' ');
         TextColor(15);
       end;
       writeln();
     end;
  end;

procedure miny();
var i:integer;
begin
    for i:=1 to 40 do
    begin
        tab[Random(10),Random(10)]:=1;
    end;
end;

procedure zmien (y,x:Integer);
begin
    if (x>0)and(x<11)and(y>0)and(y<11) then
    begin
    if tab[y,x]<>1 then
    begin
    tab[y,x] :=9;

    zmien(y+1,x);
    zmien(y,x+1);
    zmien(y-1,x);
    zmien(y,x-1);
    end;
    end;
end;

begin
       a:=1;
     b:=-1;
   init();
  // miny();
   show();
   writeln('Podaj wspolrzedne Y');
   readln(y);
   writeln('Podaj wspolrzedne X');
   readln(x);
   zmien(y,x);
   show();
    readln();
  end.

Używam lazarusa, i gdy wykonuje program dostaje wiadomość.

raised exception class 'external sigsegv'

wstawienie kodu do posta, zamiana znacznika <quote> na <code>, poprawienie tytułu wątku i tagów - @furious programming

0

Random(10) losuje liczby z przedziału 0..9

0

Tylko jest taki problem że jak dam tak :

zmien(y,x+1);
zmien(y-1,x);

to jest ok.

A jak jest już tak :

zmien(y+1,x);
zmien(y,x+1);
zmien(y-1,x);
zmien(y,x-1);

To się sypie.

dodanie znaczników <code class="delphi"> - @furious programming

0

a jeśli dodasz dodatkowe pary nawiasów do tego if'a? albo rozdzielisz to wyrażenie spacjami? na wklej.org formatowanie w tym miejscu jest jakieś dziwne.

0

Bez zmian. : (

0

Masz zmienne globalne nazwane y,x oraz w procedurze zmien masz identyczne nazwy - zamień je na coś innego

0

Zamieniłem na r i t. Dalej bez zmian.

0

na pewno tu masz błąd

procedure miny();
var
  i: integer;
begin
  for i := 1 to 40 do
  begin
    tab[Random(10), Random(10)] := 1;
  end;
end;

powinno być

    tab[Random(10) + 1, Random(10) + 1] := 1;
0

To już poprawiłem. Ale 2 sprawa to za komentowałem wywołanie ten procedury. Wtedy powinna cała plansza pokryć się 9. Kiedy mam

zmiana (y-1,x) 

to jest ok, ale jak mam już

zmiana (y-1,x); zmiana (y+1,x)

to się wysypuje.

Nie wiem dlaczego jest konflikt tutaj. Czyżbym nie mógł tej procedury z inną zmiana parametru wywołać. Bardzo dziwne.

dodanie znaczników <code class="delphi"> - @furious programming

1

No to ostatni strzał jak to nie będzie to to lama ze mnie :P
Chyba wpadasz w nieskończoną rekurencję

if tab[y,x]<>1 then
    begin
    tab[y,x] :=9;

zamieniasz liczbę 9 na 9 i wywołujesz to dalej dla 4 sąsiadów, sąsiedzi robią to samo (wracając na poprzednie pole).

Powinno wystarczyć jak zmienisz tego if'a na taki

if tab[y,x]<>1 and tab[y,x]<>9 then
0

Algorytm jest wzięty stąd : http://www.algorytm.org/podstawy-grafiki/flood-fill.html
Potrzebuje go do Sapera. jeśli ktoś ma coś innego to z chęcią przyjmę.
Jak dałem tego if'a i wpisałem 5 5 dla całej tablicy wypełnionej zerami. To mi tylko punkt 5,5 zaznacza i kończy prace.
HA! teraz działa. Zapomniałem w ifach zmienic x i y na r i t.
Teraz to wygląda tak:

procedure zmien (r,t:Integer);
begin
    if ( (t > 0) and (t < 11) and (r > 0) and (r < 11) ) then
    begin
    if (tab[r,t] <>1) and (tab[r,t]<>9 )then
    begin
        tab[r,t] :=9;
    zmien(r+1,t);
    zmien(r-1,t);
    zmien(r,t+1);
    zmien(r,t-1);
    end;
    end;

end;  

i śmiga aż miło. Masz piwko :)

dodanie znacznika <code class="delphi"> - @furious programming

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