Seite 1 von 1
For To <Ausdruck2>
Verfasst: 24.02.2018 12:40
von Taz
Hallo, ist das so gewollt, das die Procedure "Test()", bei
jeder Schleife erneut aufgerufen wird, oder ist das ein Bug?
(In der Hilfe habe ich nichts über das Verhalten finden können)
Bisher war es mir von anderen Sprachen bekannt, dass der <Ausdruck2> nur 1x aufgerufen wird.
(
For <Variable> = <Ausdruck1> To <Ausdruck2> [Step <Konstante>])
Code: Alles auswählen
EnableExplicit
Define i
Procedure Test()
Print("Call Procedure, ")
ProcedureReturn 12
EndProcedure
OpenConsole()
For i=1 To Test()
PrintN("i=" + i)
Next
Input()
CloseConsole()
Re: For To <Ausdruck2>
Verfasst: 24.02.2018 12:59
von Andesdaf
Ja, das ist schon immer so und kein Bug. Der To-Ausdruck wird bei jedem Durchlauf neu ausgewertet:
Hilfe hat geschrieben: Hinweis: Beachten Sie, dass in PureBasic der Wert des <Ausdruck2> ('To' Wert) auch innerhalb der For : Next Schleife geändert werden kann. Dies kann bei falscher Anwendung zu Endlos-Schleifen führen.
Re: For To <Ausdruck2>
Verfasst: 24.02.2018 13:04
von STARGÅTE
Wenn das nicht gewollt ist, kann man die Schleife anders herum durchlaufen:
Code: Alles auswählen
EnableExplicit
Define i
Procedure Test()
Print("Call Procedure, ")
ProcedureReturn 12
EndProcedure
OpenConsole()
For i=Test() To 1 Step -1
PrintN("i=" + i)
Next
Input()
CloseConsole()
Re: For To <Ausdruck2>
Verfasst: 24.02.2018 13:24
von Taz
Andesdaf hat geschrieben:Ja, das ist schon immer so und kein Bug. Der To-Ausdruck wird bei jedem Durchlauf neu ausgewertet:
Hilfe hat geschrieben: Hinweis: Beachten Sie, dass in PureBasic der Wert des <Ausdruck2> ('To' Wert) auch innerhalb der For : Next Schleife geändert werden kann. Dies kann bei falscher Anwendung zu Endlos-Schleifen führen.
Danke für die info

Aber das bedeutet ja nicht automatisch das <Ausdruck2> immer wieder aufgerufen wird.
STARGÅTE hat geschrieben:Wenn das nicht gewollt ist, kann man die Schleife anders herum durchlaufen:
Code: Alles auswählen
EnableExplicit
Define i
Procedure Test()
Print("Call Procedure, ")
ProcedureReturn 12
EndProcedure
OpenConsole()
For i=Test() To 1 Step -1
PrintN("i=" + i)
Next
Input()
CloseConsole()
Genial, danke dir
Mach mir bestimmt schon ca. ne stunde gedanken darüber

Re: For To <Ausdruck2>
Verfasst: 24.02.2018 13:32
von Kiffi
Taz hat geschrieben:Mach mir bestimmt schon ca. ne stunde gedanken darüber

sowas hier wäre natürlich auch möglich gewesen:
Grüße ... Peter
Re: For To <Ausdruck2>
Verfasst: 24.02.2018 13:44
von Taz
haha schon klar
Mir ging es nur um das Prinzip, weil ich das so nicht kannte.
bzw. schreibe ich gerade ein Macro in einem Modul, und wollte möglichst platzsparend arbeiten.
Re: For To <Ausdruck2>
Verfasst: 24.02.2018 20:37
von DarkSoul
Bisher war es mir von anderen Sprachen bekannt, dass der <Ausdruck2> nur 1x aufgerufen wird.
Welche denn?
Die meisten heutigen Sprachen stammen syntaktisch irgendwie von C ab (C++, C#, JavaScript, Java...) und bei denen ist das auch so, dass bei jedem Durchlauf die Abbruchbedingung geprüft wird.
Code: Alles auswählen
int found = 0;
for (int i = 0; i < 100 && found == 0; i++) {
//läuft nur 20x
if (i >= 19) {
found = 1;
}
}
Wenn du statt "found" eine Prozedur aufrufst, dann wird die auch immer wieder neu aufgerufen.

.
Ist ein gerne übersehener Performance-Killer, wenn die Abbruchbedingung zu rechenintensiv ist.
