Einzelnen Beitrag anzeigen

alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#17

Re: Zuweisung für FOR-Schleifenvariablen wird nicht akzeptie

  Alt 7. Apr 2006, 11:53
Hi,

Die While-Schleifenlösung ist zwar vom Sprachkonzept her die sauberste, aber in der Realität grauenvoll.

Delphi-Quellcode:
i:=0;
While (i<m) and Not AbortedByInnerCode Do Begin
  j := 0;
  While (j<n) and Not AbortedByInnerCode Do Begin
    k := 0;
     While (k < r) and Not AbortedByInnerCode Do Begin
       l := 0;
       While (l < p) and Not AbortedByInnerCode Do Begin
         If DoSomeThing = DoesNotWork Then
           AbortedByInnerCode := True;
         l := l + 1;
       End;
       k := k + 1;
     End;
     j := j + 1;
  End;
  i := i + 1;
End;
Äh.. sauber?

Hier die Goto-Version: Ich finde das besser, weil es lesbarer und *kein* Spaghetticode ist. Denn nicht jedes Goto macht aus Code gleich eine Frickelschusterei. Goto ist ein legitimer Befehl, der -richtig (und damit sparsam!) dosiert- den Code übersichtlicher macht.
Delphi-Quellcode:
For i:=0 t o m-1 do
  For j:=0 to n-1 do
    For k:=0 to r-1 do
     For l:=0 to p-1 do
       If DoSomeThing = DoesnotWork Then
          Goto ExitLoop;

ExitLoop:
Mal ehrlich: Was ist übersichtlicher?
Ich würde allerdings eine lokale Prozedur verwenden:
Delphi-Quellcode:
Procedure OuterProc;
Var
  m,n,o,p : Integer;

  Procedure InnerLoop;
  Var
    i,j,k,l : Integer;
 
  Begin
    For i:=0 t o n-1 do
      For j:=0 to m-1 do
        For k:=0 to o-1 do
          For l:=0 to p-1 do
            If DoSomeThing = DoesnotWork Then
              Exit;
  End;

Begin
  ...
  InnerLoop;
  ...
End;
Damit sind die Goto-Ablehner zufriedengestellt. Ach so, die lokale Prozedur bekommt natürlich einen aussagekräftigen Namen. Denn eigentlich ist es ein 'ausführbarer Kommentar'.

Unabhängig davon, ob 4 verschachtelte Schleifen nicht vielleicht ein falsches Konzept/Algorithmus implizieren, ist die Beendigung aus dem inneren von Schleifen eine generelle Frage, die ich, einmal beantwortet, konsistent und konsequent durch den Code ziehen würde. Also
Entweder IMMER
- mit While-Schleifen arbeiten und einen Flag mitschleppen, ODER
- mit Goto arbeiten, ODER
- mit lokalen Prozeduren und Exit.

Ach, eins noch: Eine andere (sinnvolle) Verwendung für das GOTO fällt mir übrigens nicht ein, Euch etwa?
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat