Programowanie w języku Delphi » Artykuły

Instrukcja goto

Instrukcja "goto" umożliwia skok wprost do umieszczonej w programie etykiety zadeklarowanej uprzednio dyrektywą "label" (Proszę nie mylić z komponentem TLabel), a tym samym wykonywanie pierwszej następującej po niej instrukcji, tak jak w poniższym przykładzie:

procedure TForm1.Button1Click(Sender: TObject);
var
  i : integer;
  label Petelka1;
begin
  Memo1.Clear;
  i :=0
  Petelka1:
  Inc(i);
  Memo1.Lines.Add(IntToStr(i));
  if i < 5 then
    goto Petelka1
end;


Po napotkaniu instrukcji "goto" następuje skok do miejsca programu oznaczonego daną etykietą.

Według specjalistów:

Stosowanie instrukcji "goto" w Object Pascalu jest uważane za zły zwyczaj. Jednak czasami ta funkcja bardzo nam się przydaje. Wszystko to co można zrobić instrukcją "goto" można również osiągnąć stosując pętle: repeat i while.

Goto może się szczególnie przydać do opuszczenia wielokrotnie zagnieżdżonych pętli repeat..until, for lub while (do opuszczenia pojedynczej pętli służy procedura Break z modułu System).

Jeżeli chce się pominąć goto przy opuszczaniu wielokrotnie zagnieżdżonych pętli trzeba użyć Break w połączeniu ze zmienną typu Boolean.

np:

var
  Koniec: Boolean;
begin
  Koniec := false;
  repeat
    //Instrukcje pierwszej pętli
    repeat
      //Instrukcje pierwszej pętli
      repeat
         if {Jakiś warunek przerwania pętli} then
         begin
           Koniec := true;
           Break;
         end;
      until Koniec or {Jakiś inny warunek};
    until Koniec or {Jakiś inny warunek};
  until Koniec or {Jakiś inny warunek};
end;


Nie wskazane jest stosowanie goto z bardzo prostych przyczyn:

1. Bardzo łatwo jest wówczas stworzyć niekończącą się pętlę i trudno jest potem znaleźć błąd (oczywiście przy bardziej złożonych skokach).

2. Goto jest używane najczęściej w programowaniu niestrukturalnym. Stosowanie tej instrukcji w Pascalu (języku strukturalnym) zmniejsza czytelność kodu.

11 komentarzy

Szczawik 2005-07-15 02:14

Tak na prawdę burzę wokół konstrukcji programistycznej GoTo rozpętał Edgar (Edsger) Dijkstra w referacie wygłoszonym w 1968 roku i jednocześnie opublikowanym na łamach wielu czasopism naukowych. Referat był zatytułowany "Go To statement considered harmful".

Fragment tekstu w wersji angielskiej:
<url>http://www.ifi.unizh.ch/groups[...]vse/uebungen/Dijkstra_Goto.pdf</url>
<url>http://www.acm.org/classics/oct95/</url>

sablik 2004-01-14 12:08

Skoro jest w języku to stosowanie goto nie jest przestępstwem a czasem pomaga w pętlach decyzyjnych

brodny 2004-09-02 22:29

Ale całe źródło biblioteki VCL zawiera tylko DWA użycia instrukcji goto. I oba służą do wyskakiwania z zagnieżdżonych pętli.

Piro 2003-08-21 20:19

Zgadzam się z brodny &#8211; goto istnieje po to aby z niej korzystać. Co do długości &#8222;label&#8221; to cytuję fragment pliku pomocy Delphi 6:
A label can be any valid identifier or any numeral between 0 and 9999.
:)

jasek 2003-06-21 21:33

Pisze sie artykuł.

brodny 2003-05-07 09:28

Także się zgadzam. Śwadczy to bardzo źle o programiście. Niemniej jednak, goto istnieje po to :), aby z niej korzystać. Inna sprawa: o ile dobrze zrozumiałem pomoc, to identyfikatory etykiet (label) mogą mieć tylko 4 znaki długości i zaczynać się literą.

Johny 2003-02-10 15:07

Ja też się zgadzam ale nierozumiem dlaczego to u mnie nie działa.

Ktos 2002-12-28 14:59

jak wyraził się jeden z projektantów pascala "wykorzystanie instrukcji skoku (goto) w programie w Pascalu oznacza, że programista nie pojął tego języka"

grzybbol 2002-12-29 13:11

Zgadzam się z Ktosiem.

Wiktor 2002-10-15 18:42

Trochę krótki ten artykół, ale wyjaśnia chba wszystko.