For To <Ausdruck2>

Für allgemeine Fragen zur Programmierung mit PureBasic.
Taz
Beiträge: 27
Registriert: 20.01.2018 18:24
Wohnort: NRW

For To <Ausdruck2>

Beitrag 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()
Andesdaf
Moderator
Beiträge: 2660
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: For To <Ausdruck2>

Beitrag 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.
Win11 x64 | PB 6.00 (x64)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: For To <Ausdruck2>

Beitrag 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()
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Taz
Beiträge: 27
Registriert: 20.01.2018 18:24
Wohnort: NRW

Re: For To <Ausdruck2>

Beitrag 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:
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: For To <Ausdruck2>

Beitrag 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
Hygge
Taz
Beiträge: 27
Registriert: 20.01.2018 18:24
Wohnort: NRW

Re: For To <Ausdruck2>

Beitrag 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.
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Re: For To <Ausdruck2>

Beitrag 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:
Bild
Antworten