AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

For in For dann Goto

Ein Thema von demic · begonnen am 15. Mär 2011 · letzter Beitrag vom 16. Mär 2011
Antwort Antwort
Seite 3 von 3     123
WM_CLOSE

Registriert seit: 12. Mai 2010
Ort: königsbronn
398 Beiträge
 
RAD-Studio 2009 Pro
 
#21

AW: For in For dann Goto

  Alt 16. Mär 2011, 10:44
Und warum nicht so:
Delphi-Quellcode:
var
  boBreak:Boolean;
begin
  for a := 0 to 10 do
  begin
    for b := 0 to 20 do
    begin
      ...
      if ... then
      begin
        boBreak:=True;
        Break;
      end;
    end;
    if boBreak then
      break;
    if ... then Break;
  end;
end;
?
  Mit Zitat antworten Zitat
Benutzerbild von JamesTKirk
JamesTKirk

Registriert seit: 9. Sep 2004
Ort: München
598 Beiträge
 
FreePascal / Lazarus
 
#22

AW: For in For dann Goto

  Alt 16. Mär 2011, 13:17
Warum sollte es reichen?

Diese Variableninhalte sind nach der Schleife undeffiniert.
Davor Zu Beginn wird es von Delphi automatisch initialisiert.
(nämlich mit dem Wert nach dem := des For-To/Downto-Do)
Und wie grade erwähnt, optimiert der Compiler deine Zuweisungen eh weg.
Während ich voll zustimme, dass man normalerweise nicht nach der Schleife auf die Werte der Schleifenvariablen zugreifen sollte, so gibt es doch folgenden Eintrag in der Hilfe zu der zitierten Warnung: W1037: FOR-Loop variable '%s' may be undefined after loop (Delphi)

Besonders hervorheben möchte ich folgenden Absatz:
Zitat:
You can only rely on the final value of a for loop control variable if the loop is left with a goto or exit statement.
Wer hat nun Recht? Die Hilfe oder alle, die sagen, dass man nicht drauf zugreifen darf?

Gruß,
Sven
Sven
[Free Pascal Entwickler]
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.602 Beiträge
 
Delphi 2007 Enterprise
 
#23

AW: For in For dann Goto

  Alt 16. Mär 2011, 13:50
Es ist hier doch überhaupt nicht das Problem, wenn die Schleife via Goto verlassen wird. Das Problem ist, dass der Code hinter dem Label auch ausgeführt wird, wenn die Bedingung vor dem Goto niemals zutrifft! Von daher ist diese Warnung mit diesem Wortlaut auch völlig korrekt - das hatte ich aber auf Seite eins schon gesagt. Das und NUR das ist das konkrete Problem, von all der Goto-Diskussion unberührt, die natürlich wieder auf 3 Seiten breit gezogen werden musste, weil man es ja so selten und unzureichend bespricht...
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#24

AW: For in For dann Goto

  Alt 16. Mär 2011, 14:01
Statt dem GOTO könnte man eine Sub-Procedure aufrufen und hätte dann das Problem mit dem ereignislosen Scheifendurchlauf auch gleich gelöst:

Delphi-Quellcode:
procedure Something;

  procedure OnlyIfTrue;
  begin
    //
  end;

var
  a,b : IntegerM
begin
  for a := 0 to 10 do
    for b := 0 to 20 do
      if True then
      begin
        OnlyIfTrue;
        Exit;
      end;
end;
  Mit Zitat antworten Zitat
demic
(Gast)

n/a Beiträge
 
#25

AW: For in For dann Goto

  Alt 16. Mär 2011, 16:56
Hallo,

so viele Nachrichten... alles wegen Goto
Also "PRINT" und "GOTO" waren die ersten Befehle die ich gelernt hatte... zumindest auf dem C64

Aber erst mal Danke für die vielen Vorschläge. Ich hatte den Code vereinfacht. Der richtige Code behandelt 3 StringGrids, sprich nach dem ersten Doppel-FOR das gleiche noch 2x, deshalb ist ein EXIT nicht auf einfacher Weise möglich. Zu der "If Prüfung Then Goto ForEnd"... es ist eine Prüfung die 100% eintritt aber das weis Delphi ja nicht, deshalb wohl die Warnung.

Ich bin heute auf folgende Idee gekommen. Hier der richtige Code:
Delphi-Quellcode:
Procedure TForm1.CheckGridCell(DG : TmyGrid);
Var NCol,NRow,i : LongInt;
Begin
 With DG Do
 Begin
  SelPaint := False;
  For NCol := 0 to ColCount-1 Do
  Begin
   For NRow := 0 to RowCount-1 Do
   Begin
    i := (NCol*(RowCount)) + NRow;
    If ACell = Dirlist[i].Name Then
    Begin
     Row := NRow;
     Col := NCol;
     If ShowStyle = ssFull Then
     begin
      if row < toprow then toprow := row
      else if row > toprow+visiblerowcount-1 then toprow := row-visiblerowcount+1;
     end;
     SelPaint := True;
     RePaint;
     Exit;
    End;
   End;
  End;
 End;
End;
Ich rufe an den nötigen Stellen die Prozedur 3x auf.
Delphi-Quellcode:
CheckGridCell(Grid1);
CheckGridCell(Grid2);
CheckGridCell(Grid3);
Mit der Parameterübergabe hat der Inhalt der Prozedur auch weniger Zeilen und ein EXIT kann ich so einsetzen. Warnungen gibt's von Delphi so auch nicht mehr.

Auch Danke für den Tipp, zum einfügen von Delphi-Code.

Gruß
Michael
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:09 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf