![]() |
Delphi-Version: 5
For in For dann Goto
Hallo,
habe einen Code der funktioniert. Als Beispiel:
Delphi-Quellcode:
Delphi gibt hier Warnungen aus:
procedure...
label ForEnd; begin for a := 0 to 10 do begin for b := 0 to 20 do begin if prüfungsachen u.a. mit 'a' und 'b' then Goto ForEnd; end; end; ForEnd: ... variable a und b für die weitere Verarbeitung end; For Schleifenvariable 'a' kann nach Durchlauf undefiniert sein For Schleifenvariable 'b' kann nach Durchlauf undefiniert sein Versteh ich nur halbwegs... z.b. wenn ein Goto vor der FOR-Schleife stattfinden sollte. Das ist jetzt nicht der Fall. Habe nun mal die Hilfe gelesen. Da steht folgendes: Diese Warnung wird angezeigt, wenn die Steuervariable einer for-Schleife nach der Schleife verwendet wird. Sie können sich nur auf den letzten Wert eines for-Schleifenzählers verlassen, wenn die Schleife mit einer goto- oder exit-Anweisung verlassen wird. Der Grund für diese Einschränkung ist, dass der Compiler dadurch sehr effizienten Code für die for-Schleife erzeugen kann. Je nach Prüfung verlässt Goto die beiden FOR-Schleifen korrekt und in 'a' und 'b' habe ich die richtigen Werte. Ich lese jedoch in der Hilfe, dass ich mich eigentlich nur darauf verlassen kann, dass in 'a' der Wert 10 und in 'b' der Wert 20 stehen kann. Verstehe ich etwas falsch? Gruß Michael |
AW: For in For dann Goto
Das Problem hier ist, dass die Schleife ggf. komplett durchlaufen kann, und dann ja trotzdem der Code unter deinem ForEnd Label ausgeführt wird. In diesem Falle wären dann a und b undefiniert. Lösung: Nutze ein weiteres Label, dass im unmittelbar nach der Schleife angesprungen wird, also wenn die "prüfungssachen mit a und b" nie zutreffen. Alternativ muss man natürlich empfehlen, das Konzept an der Stelle komplett zu überdenken, da Gotos allgemein zu miserablem Stil zählen ;)
Edit: Mit den [ delphi] ... [ /delphi] Tags (ohne Leerzeichen) schaut der Code hier im Forum auch hübsch aus, Beispiel:
Delphi-Quellcode:
procedure...
label ForEnd, ForNothing; begin for a := 0 to 10 do begin for b := 0 to 20 do begin if prüfungsachen u.a. mit 'a' und 'b' then Goto ForEnd; end; end; Goto ForNothing; ForEnd: ... variable a und b für die weitere Verarbeitung ForNothing: end; |
AW: For in For dann Goto
Holla, sehe ich da ein Goto?
LOL, gibts das in Delphi? Wo benutz man den dieses noch? Ausser in diesem Beispiel. alfold |
AW: For in For dann Goto
Streng genommen halt garnicht :mrgreen:
|
AW: For in For dann Goto
Zitat:
Der Ausbruch aus mehreren verschachtelten Schleifen ist eine der wenigen Gelegenheiten in denen man es eventuell akzeptieren kann. Wurde schon oft diskutiert: ![]() Im Prinzip ist die Zählervariable außerhalb der for-Schleife undefiniert, aber anscheinend wird der aktuelle Wert garantiert, wenn man mit exit oder goto aus der Schleife springt. Eine andere Variante, die keine Warnungen bringen sollte:
Delphi-Quellcode:
Beide Varianten machen etwas anderes.
procedure tuWas;
label ForEnd; begin for a := 0 to 10 do begin for b := 0 to 20 do begin if prüfungsachen u.a. mit 'a' und 'b' then Goto ForEnd; end; end; // Wenn nicht herausgesprungen, // setze die Zählervariablen auf Endwerte. a := 10; b := 20; ForEnd: //... variable a und b für die weitere Verarbeitung end; PS: Mediums Variante geht mit exit (dem kleinen Bruder von goto) allerdings auch:
Delphi-Quellcode:
procedure tuWas;
begin for a := 0 to 10 do begin for b := 0 to 20 do begin if prüfungsachen u.a. mit 'a' und 'b' then begin //... variable a und b für die weitere Verarbeitung exit; // Achtung: springe aus der ganzen Prozedur end; end; end; end; |
AW: For in For dann Goto
Daaaa haste völlig Recht, so wäre es noch netter. Exit sehe ich auch bei weitem als nicht ganz so fies an, nicht zuletzt, weil ich aus C-likes mit "return foo;" ein "result := foo; Exit;"-Konstrukt mittlerweile gewöhnt bin und zu schätzen gelernt habe. Das war auch grob, was ich mit "Konzept überdenken" gemeint hatte: Den Schleifenteil in eine Methode auslagern, die im frühen Erfolgsfall mit dem Ergebnis zurück kehrt. (Schaut mir nämlich arg nach einem (bi-)liniearen Suchvorgang aus, wo so was klassisch ist.)
|
AW: For in For dann Goto
Währe in seinem Beispiel nicht Break besser als goto?
Exit bedeutet doch das ich die Procedure vorzeitig verlasse. Break, ich unterbreche die Schleife. Oder verwirrt mich jetzt das goto :shock: € alles zurück habs verstanden 8-) musste es 2 mal lesen alfold |
AW: For in For dann Goto
Steht doch im Kommentar, Exit verlässt die gesamt Prozedur.
Oder was meinst du? |
AW: For in For dann Goto
Nee alles ok :mrgreen:
War noch mit den Gedanken bei der Diskusion über GOTO:duck: alfold |
AW: For in For dann Goto
Delphi-Quellcode:
dieses läßt sich so behandeln
procedure...
label ForEnd; begin for a := 0 to 10 do begin for b := 0 to 20 do begin if ... then Goto ForEnd; end; end; ForEnd: ... end;
Delphi-Quellcode:
ABER
procedure...
label ForEnd; begin try for a := 0 to 10 do begin for b := 0 to 20 do begin if ... then Exit; end; end; finally ... end; end; Zitat:
also liegt hier eh ein gravierender Logikfehler vor :!: Man kann diese Variablen zwar wiederverwenden, aber nach den Schleifen sind deren werte erstmal "undefiniert", weswegen sie bei einer Wiederverwendung notfalls nochmal initialisiert werden müssen. So oder so, nach dem Exit darf auf diese Schleifen-Variablen nicht nochmal lesend zugegriffen werden. Die einzige Lösung wären also Repeat- oder While-Schleifen. Und ja, Goto hat teilweise auch seine Berechtigung. Von mir schwirrt sogar ein Code damit in der CodeLib rum, welcher sich anders hätte wesentlich umständlicher lösen lassen :angle2: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz