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
Benutzerbild von vergessen
vergessen

Registriert seit: 29. Jun 2010
85 Beiträge
 
Delphi 5 Professional
 
#1

AW: For in For dann Goto

  Alt 16. Mär 2011, 08:14
@himitsu, schon klar, aber dem TE geht es wohl um

zitat
Delphi gibt hier Warnungen aus:
For Schleifenvariable 'a' kann nach Durchlauf undefiniert sein
For Schleifenvariable 'b' kann nach Durchlauf undefiniert sein

dachte ich.

Daher sollte ein
Delphi-Quellcode:
a:=0;
b:=0;
vor den Schleifen reichen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.360 Beiträge
 
Delphi 12 Athens
 
#2

AW: For in For dann Goto

  Alt 16. Mär 2011, 08:21
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.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (16. Mär 2011 um 08:23 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#3

AW: For in For dann Goto

  Alt 16. Mär 2011, 09:43
Die Schleifenvariable kann undefiniert sein.
Dann nimm ein Repeat Until oder ein While und Du hast eine Schleife und Deine Variable ist definiert.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
WM_CLOSE

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

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
604 Beiträge
 
FreePascal / Lazarus
 
#5

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 Compiler Entwickler]
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat
Medium

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

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
 
#7

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
 
#8

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
Antwort Antwort

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 17:57 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-2025 by Thomas Breitkreuz