For Next Schleife - Wert der Variablen

  • Hallo,

    AutoIt
    For $i = 1 To 2
    				ConsoleWrite("$i = " & $i &  @CRLF)
    Next
    				ConsoleWrite("$i  (nach der For Next Schleife) = " & $i &  @CRLF)


    $i = 1
    $i = 2
    $i (nach der For Next Schleife) = 3

    Warum nimmt $i nach der Schleife den Wert 3 an, wenn die Schleife selbst nur 1 und 2 beinhaltet?
    Was ist der tiefere Sinn dahinter, dass die Programmierer $i um 1 höher setzen (hier also auf 3), als der For ... To ... Befehl 1 bis 2 vorgibt?

    Next soll doch nur bis $i = 2 erfolgen, dann sollte doch nach $i = 2 kein Next-Befehl mehr erfolgen, der $i erhöht - oder?

    Gute Nacht :)

    PS: Ist eine reinge Verständnisfrage - ich kenne aus anderen Programmiersprachen keine Schleifenkonstruktion, bei der der Wert in einer vergleichbaren Konstruktion $i größer als der To Wert gesetzt wird.

  • Weil nach jedem Schleifendurchlauf der Step-Parameter auf i addiert wird.
    Wenn i also 2 ist wird die Schleife das letzte Mal durchlaufen und am Ende wird nochmal der Step-Parameter addiert (ist aber undokumentiertes/widersprüchliches Verhalten)

  • Bei For ... Next Schleifen wird die zu Iteriende Variable bei jedem Next um Step (default 1) erhöht und das nächste For prüft auf Gültigkeit und bricht bei Bedarf ab.

    @CentuCore: Zählschleifen sind eine Sonderform einer Kopfgesteuerten Schleife:

    3 Mal editiert, zuletzt von autoBert (9. März 2016 um 02:54)

  • Man könnte an der Stelle auch den Pseudo-Code von Wikipedia herbei ziehen, da steht der Ablauf gut erläutert:
    https://de.wikipedia.org/wiki/For-Schle…tierte_Schleife
    Zitat:


    Im Klartext auf AutoIt abstrahiert:
    Initialisierung: $i = *
    Test: $i <= bzw >= bzw. was auch immer n
    Fortsetzung: Step 1, Step -1, Step n
    Anweisung: Der Code in der Schleife.

    €: Was für Sprachen kennst du denn noch?
    Unter C liefert mir das hier eindeutig (egal ob i++ oder ++i) immer die 3.


    Und ich bin mir nahezu sicher, dass es in allen anderen Sprachen auch so ist.
    Du solltest beachten, ob du "echt kleiner" oder "Kleiner gleich" nimmst.

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • @autoBert Schon klar wie eine For-Schleifen funktioniert, aber die Doku sagt eindeutig: "stop: the final value of the variable". (stop ist der Wert nach 'To')
    Entsprechend müsste die Zählvariable nach der Schleife auf den stopp-Wert gesetzt werden.
    Das ist für mich undokumentiertes/widersprüchliches Verhalten.

  • Ich würde eher sagen schlecht dokumentiert bzw. nicht alles gelesen:

    Zitat von Helpfile

    The For loop terminates when the value of variable exceeds the stop threshold

    daß heißt die Zähl-Variable hat den Stopwert bereits überschritten und warum sollte man noch Rechenzeit investieren um sie auf den Stopwert zurückzusetzen?


    Zitat von dt. Hilfeübersetzung

    Die Schleife wird verlassen, wenn der Wert von variable die stop-Grenze überschreitet.

    und dies ist in allem mir bekannten Programmiersprachen bei Zählschleifen so.

    Einmal editiert, zuletzt von autoBert (9. März 2016 um 15:44)

  • Und trotzdem widersprüchliches Verhalten bleibt widersprüchlich.

    Edit: Zudem widerspricht das Terminieren der Schleife nicht, dass die Variable am Ende trotzdem den To-Wert erhalten muss. Zumal es in der Doku so beschrieben wurde.
    Es bleibt für mich undokumentiertes Verhalten.

    Einmal editiert, zuletzt von CentuCore (9. März 2016 um 15:50)

  • Vielen Dank für Eure Hinweise.


    Gerade wenn man auf ein Array zurückgreift und das nach dem Schleifendurchlauf macht, führt das zu einem Fehler. Da das Array kleiner dimensioniert ist als der Wert $i.

    Ich bin auch der Auffassung, dass eine Schleifenvariable nie einen höheren Wert nach der Ausführung der Schleife haben sollte, als der Maximalwert angibt.

    Rechenzeit wird somit doch wieder notwendig – einfach -1 :) Problem gelöst.

    Danke noch mal und ich habe das Thema auf erledigt gestellt.

  • Es ist der Maximalwert der Variable zur Abarbeitung der Anweisungen innerhalb des Schleifenblocks. Wie bereits gesagt For prüft und führt aus solange die Bedingungen erfüllt sind. Next iteriert um den Wert Step.

  • Und trotzdem widersprüchliches Verhalten bleibt widersprüchlich.

    Edit: Zudem widerspricht das Terminieren der Schleife nicht, dass die Variable am Ende trotzdem den To-Wert erhalten muss. Zumal es in der Doku so beschrieben wurde.
    Es bleibt für mich undokumentiertes Verhalten.

    Wo ist das Verhalten widersprüchlich? Siehe Wikipedia, ich postete den Link bereits. Das ist alles korrekt beschrieben.

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

    • Offizieller Beitrag
    Zitat von AutoMit

    Gerade wenn man auf ein Array zurückgreift und das nach dem Schleifendurchlauf macht, führt das zu einem Fehler. Da das Array kleiner dimensioniert ist als der Wert $i.

    Was willst du denn genau nach der Schleife machen?
    Zeig mal deinen Code.
    Ich habe noch nie den Zählerwert der Variable $i nach der Schleife gebraucht.
    Wenn du in der Schleife eine If Abfrage machst, dann kann man daran einen Befehlsblock anhängen der das Array bearbeitet.
    Für mich gibt es keinen Grund auf $i nach der Schleife zuzugreifen und wenn doch, dann per Ubound($array) -1, was der Maximalwert des 0 basierten Arrayindex ist. Oder anders gesagt, der Maximalwert der For Next Schleife ist dir ja schon bekannt, warum also auf die Zählervariable zugreifen nach dem Schleifenende?

  • Wo ist das Verhalten widersprüchlich? Siehe Wikipedia, ich postete den Link bereits. Das ist alles korrekt beschrieben.

    .., weil in der Doku steht: "stop - The final numeric value of the variable." (der To-Wert)
    Und wie bereits aufgezeigt verhält sich AutoIt da anders als beschrieben <=> widersprüchliches/undokumentiertes Verhalten
    Wie ein C-Standard eine For-Schleife für sich definiert hat mit AutoIt nichts zu tun.

    • Offizieller Beitrag

    Also ich versteh die ganze Aufregung nicht. Auch wenn die Zählervariable nach der Schleife den Wert "Hundekuchen" hätte, wer die Welt noch in Ordnung. Das reguläre Leben der Zählervariable endet beim Austritt aus der Schleife, sie ist nämlich lokal und bedarf deshalb auch keiner Deklaration. Und aus diesem kühlen Grunde ist jede Diskussion über den Inhalt einer toten Variable aus meiner Sicht absolut überflüssig.

  • Das reguläre Leben der Zählervariable endet beim Austritt aus der Schleife, sie ist nämlich lokal und bedarf deshalb auch keiner Deklaration

    Eine Zählervariable muss genauso wie jede andere Variable auch deklariert werden.
    In der For-Schleife muss sie darüber hinaus sogar auch definiert werden (es findet ja eine eindeutige Wertzuweisung statt)
    Implizit wird sie dann aber tatächlich als local deklariert:

    AutoIt
    $i = 1
    Test()
    ConsoleWrite($i & @CRLF)
    
    
    Func Test()
    	For $i = 3 To 3
    	Next
    EndFunc

    AutoIt kennt als Gültigkeitsbereiche jedoch nur innerhalb vs. außerhalb von Funktionen.
    Eine lokale Gültigkeit nur für den Bereich der For-Schleife wie es in späteren C-Standards möglich ist gibt es in AutoIt aber nicht.
    Dass sie auch nicht allein für den For-Schleifenbereich Gültigkeit besitzt sieht man auch daran, dass Sie, bei Vorhandensein, auf vorher deklarierte Variablen zurückgreift und diese direkt verändert:

    AutoIt
    $i = 5
    For $i = 1 To 3
    Next
    ConsoleWrite($i & @CRLF)

    Es ist daher absolut legitim und notwendig sich über das Verhalten außerhalb der Schleife Gedanken zu machen.

    Intuitiv hätte ich übrigens genauso wie CentuCore argumentiert.
    Dass es nicht der Fall ist überrascht mich auch ein wenig.
    Habe allerdings nicht direkt den Vergleich im Kopf wie es andere Sprachen handhaben.
    Bei diesen kann es aber auch dazu kommen, dass sich die Frage nicht stellt, da diese, je nach Sprache, einen Gültigkeitsbereich nur für die Schleife kennen.

  • @AspirinJunkie - Es ist legitim, wenn man AutoIt verwendet. Ansonsten sehe ich da aber keine Notwendigkeit, wenn die Variable in einer anderen Sprache (z.B. C seit Standard 99) im Schleifenkopf selbst, und damit als Gültigkeit nur für die nachfolgenden Anweisungen, deklariert werden.
    Allerdings ist es - wie ich bereits mit dem Wikipedia Artikel zur Funktionsweise der For-Schleife zeigt - absolut klar, wie sie funktioniert.

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Und alles nur weil

    Zitat von dt. Hilfe

    stop Der Endwert der Zählervariable.

    und niemand die Bemerkungen liest:

    Edit: ist im Original genauso nur halt Englisch.