[pascal] lista - wyczysc

0

Gdy wywoluje procedure wyczysc, wywala mi blad nr204:Invalid pointer operation, albo po wyswietlenie wstawia jakies smieci. Używam Borland Turbo Pascala 7.0

program listy;
uses crt;

type wsk=^punkt;
     punkt=record
     a,b:Byte;
     next:wsk;
     end;

function dodaj(i,j:Byte; head:wsk):wsk;
var el,tmp:wsk;
begin
     new(el);
     tmp:=head;
     head:=el;
     el^.next:=tmp;
     el^.a:=i;
     el^.b:=j;
     dodaj:=head;
end;

procedure wyczysc(head:wsk);
var temp:wsk;
begin
     temp:=head;
     while (temp<>nil) do
     begin
          head:=temp^.next;
          dispose(temp);
          temp:=head;
     end;
     head:=nil;
end;

procedure show(head:wsk);
var temp:wsk;
begin
     temp:=head;
     while temp<>nil do
     begin
          writeln(temp^.a,' ',temp^.b);
          temp:=temp^.next;
     end;

end;

var
    head:wsk;
    x,y:Byte;
    m:char;

begin
     head:=nil;
     repeat
     begin
     writeln('1.dodaj');
     writeln('2.wyczysc');
     writeln('3.wypisz');
     writeln('0. koniec');
     m:=readkey;
     case m of
     '1': begin
             writeln('podaj dane');
             readln(x,y);
             head:=dodaj(x,y,head);
        end;
     '2': wyczysc(head);
     '3': show(head);
     end;
     end;
     until m='0';

end.
0
procedure wyczysc(var head:wsk);
var temp:wsk;
begin
     while (head<>nil) do
     begin
          temp:=head;
          head:=head^.next;          
          dispose(temp);
     end;
end;

wypisujesz poprawnie, ale przy czyszczeniu sie gdzies zgubiles

0

dalej jest blad i to ten sam

0

Hallo smolo!

Blad polega na tym, ze zmienna head zadeklarowana w programie glownym i zmienna head uzywana w procedurze wyczysc, to dwie rozne zmienne. Dlatego po wykonaniu wyczysc wartosc zmiennej head w programie glownym nie jest rowna nil (jak to mozna by bylo blednie oczekiwac po podstawieniu head:=nil w procedurze wyczysc). Usuniecie bledu jest proste:

po pierwsze:
procedure wyczysc nalezaloby zadeklarowac jako funkcje, ktora zwraca "wyczyszczony" wskaznik na head:

function wyczysc(head:wsk):wsk;
var temp:wsk;
begin
     temp:=head;
     while (temp<>nil) do
     begin
          head:=temp^.next;
          dispose(temp);
          temp:=head;
     end;
     head:=nil;

     wyczysc := head;
end;

po drugie:
w programie glownym nalezaloby odebrac te wartosc i przypisac ja zmiennej head (tym razem head z programu glownego):

'2': head:=wyczysc(head);

Pozdrawiam
Markus
[???]

0

wielkie dzieki Markus. Tez myslalem, zeby zrobic z tego funkcje, ale wszedzie gdzie patrzylem to byla procedura

0

Hallo smolo!

Mozna rowniez zamiast fuction zastosowac procedure. Wtedy trzeba tylko inaczej przekazac jej parametr head:

procedure wyczysc(var head:wsk);
var temp:wsk;
begin
     temp:=head;
     while (temp<>nil) do
     begin
          head:=temp^.next;
          dispose(temp);
          temp:=head;
     end;
     head:=nil;
end;

W tym przypadku wywolania procedury nie trzeba zmieniac:

'2': wyczysc(head);

Pozdrawiam
Markus
[???] </b>

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