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 :allright:
Mach mir bestimmt schon ca. ne stunde gedanken darüber :lol:

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 :lol:
sowas hier wäre natürlich auch möglich gewesen:

Code: Alles auswählen

TestValue = Test()
For i=1 To TestValue
 [...]
Grüße ... Peter

Re: For To <Ausdruck2>

Verfasst: 24.02.2018 13:44
von Taz
haha schon klar :lol:
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? :shock:

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. :wink:

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. :mrgreen: