Hey NicTheQuick, klasse dein Workaround.NicTheQuick hat geschrieben:Als Workaround für Ganzzahlen und maximal Integer als Step-Wert schlage ich mal einfach das hier vor:Code: Alles auswählen
Dim Reihe.i(1) #MAX_RECURSION = 10 Macro ForEx(Var, startValue, endValue, stepValue = 1) CompilerIf Defined(FOR_EX_STEP_VALUE, #PB_Array) = #False Global Dim FOR_EX_STEP_VALUE.i(#MAX_RECURSION) Global FOR_EX_STEP_VALUE_RECURSION = 0 CompilerEndIf Var = startValue FOR_EX_STEP_VALUE(FOR_EX_STEP_VALUE_RECURSION) = stepValue FOR_EX_STEP_VALUE_RECURSION + 1 While (Var <= endValue) EndMacro Macro NextEx(Var) Var + FOR_EX_STEP_VALUE(FOR_EX_STEP_VALUE_RECURSION - 1) Wend FOR_EX_STEP_VALUE_RECURSION - 1 EndMacro ForEx(Reihe(0), 1, 10) ForEx(Reihe(1), 1, 10) Debug Str(Reihe(0)) + ", " + Str(Reihe(1)) NextEx(Reihe(1)) NextEx(Reihe(0))
For Next Schleife mit Array
Re: For Next Schleife mit Array
:::: WIN 10 :: PB 5.73 :: (x64) ::::
- NicTheQuick
- Ein Admin
- Beiträge: 8838
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: For Next Schleife mit Array
Hm...ts-soft hat geschrieben:@NicTheQuick
Wenn Du schon hier liest, hättest Du die Bugs aber auch gleich melden können![]()
Solange ich meine Lieblingsprogrammiersprache nicht pjurbesic sondern purebasic mit langem e ausspreche,
bin ich dafür nicht geeignet
Na gut. Dann mache ich das gleich mal zu Hause. War eben noch wo anders, wo ich nicht mehr viel Zeit hatte, und jetzt sitze ich gerade im Zug. Ich versuch's später mal mit meinem Bröckchenenglisch.
Re: For Next Schleife mit Array
Der Grund warum eine Quad unter x86 nicht erlaubt ist, ist der, dass eine Quad nicht in einen Register passen würde.
Einfache Schleifen werden vom Compiler aber meist so optimiert, dass die Laufvariable immer im Register bleibt, damit es schneller läuft.
Einfache Schleifen werden vom Compiler aber meist so optimiert, dass die Laufvariable immer im Register bleibt, damit es schneller läuft.
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
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Re: For Next Schleife mit Array
Das ist keine Begründung. Wenn ich eine Integervariable als Zählvariable einer For/Next-Schleife verwende, ist's ja schön wenn der Compiler das optimiert. Aber wenn ich eine Quadvariable benutzen möchte, ist das meine Entscheidung. Wenn der Compiler das nicht optimieren kann, soll er's halt langsamer umsetzen. Aber die Schlussfolgerung: "Das kann ich nicht optimieren, also erlaube ich es gar nicht." ist unlogisch und für eine Hochsprache unangebracht. In einer While/Wend-Schleife kann man ja auch Quads (und sogar Floating-Point-Variablen) benutzen.STARGÅTE hat geschrieben:Der Grund warum eine Quad unter x86 nicht erlaubt ist, ist der, dass eine Quad nicht in einen Register passen würde.
Einfache Schleifen werden vom Compiler aber meist so optimiert, dass die Laufvariable immer im Register bleibt, damit es schneller läuft.
Das Problem scheint mir eher zu sein, dass die For/Next-Schleife in PureBasic primitiv implementiert ist (z.B. kann für 'Step' ja auch nur eine Konstante, und keine Variable angegeben werden).
Grüße, Nino
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: For Next Schleife mit Array
Die For Next Schleife hat als einzige Besonderheit, das sie nur Integer unterstützt und das
nach dem Next, der Wert 1 höher ist, als das Schleifenende. Durch diese Einfachheit, hat
sie auch den Vorteil der Geschwindigkeit. Für alle anderen Schleifenkonstrukte ist sie nicht
gedacht und dafür gibt es While : Wend und Repeat : Until!
Die For Next Schleife wäre überflüssig, wenn sie anders implementiert wäre, da alle Vorteile
unter den Tisch fallen.
Warum also sollte man das einbauen? Nur weil es geht?
For Next ist eine Zählschleife, da werden nur ganze Äppel gezählt und nicht die angebissenen
Gruß
Thomas
nach dem Next, der Wert 1 höher ist, als das Schleifenende. Durch diese Einfachheit, hat
sie auch den Vorteil der Geschwindigkeit. Für alle anderen Schleifenkonstrukte ist sie nicht
gedacht und dafür gibt es While : Wend und Repeat : Until!
Die For Next Schleife wäre überflüssig, wenn sie anders implementiert wäre, da alle Vorteile
unter den Tisch fallen.
Warum also sollte man das einbauen? Nur weil es geht?
For Next ist eine Zählschleife, da werden nur ganze Äppel gezählt und nicht die angebissenen
Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: For Next Schleife mit Array
Quads für For-Schleifen wurde schon gewünscht: Feature Requests and Wishlists - For and quads,
also einfach abwarten und alt werden.
EDIT:
Habe den For..Next Fehler von rolaf gemeldet: Compiler crash - For..Next with Array variable
(Kleinstmöglicher Code + "Compiler crash" hättest Du doch auch posten können, rolaf!?)
also einfach abwarten und alt werden.
EDIT:
Habe den For..Next Fehler von rolaf gemeldet: Compiler crash - For..Next with Array variable
(Kleinstmöglicher Code + "Compiler crash" hättest Du doch auch posten können, rolaf!?)
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Re: For Next Schleife mit Array
Danke und Nö.Danilo hat geschrieben:Habe den For..Next Fehler von rolaf gemeldet: Compiler crash - For..Next with Array variable
(Kleinstmöglicher Code + "Compiler crash" hättest Du doch auch posten können, rolaf!?)
:::: WIN 10 :: PB 5.73 :: (x64) ::::
Re: For Next Schleife mit Array
Von solch einer Optimierung macht PureBasic aber keinen Gebrauch. Das ist generell auch nicht zu erwarten, da die Anzahl der Register sehr begrenzt sind und - compilertechnisch gesehen - alle Register immer wieder zur Abarbeitung des nächsten Befehls zur Verfügung stehen müssen.STARGÅTE hat geschrieben:Der Grund warum eine Quad unter x86 nicht erlaubt ist, ist der, dass eine Quad nicht in einen Register passen würde.
Einfache Schleifen werden vom Compiler aber meist so optimiert, dass die Laufvariable immer im Register bleibt, damit es schneller läuft.
Eine solche Optimierung wäre nur in sehr kleinen For/Next-Schleifen vorstellbar. Mit "klein" meine ich einen kleinen Schleifenkörper ohne komplexe Befehle, wo der Compiler vorher prüfen könnte, ob ein bestimmtes Register reserviert werden kann oder nicht. Eine solche Prüfung halte ich aber im Verhältnis zum erwartenden Ergebnis (meist "fail") für sinnlos.
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
- unkommentierter Quellcode = unqualifizierter Müll
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: For Next Schleife mit Array
So so7x7 hat geschrieben:Von solch einer Optimierung macht PureBasic aber keinen Gebrauch.
/edit
Den Fehler in der dt. Hilfe hab ich jetzt hier: http://www.purebasic.fr/german/viewtopi ... 30#p298530 gemeldet.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: For Next Schleife mit Array
Das dachte ich eigentlich auch. Allerdings muss ich da 7x7 recht geben:ts-soft hat geschrieben:So so7x7 hat geschrieben:Von solch einer Optimierung macht PureBasic aber keinen Gebrauch.
Code: Alles auswählen
; For i = 0 To 9
MOV dword [v_i],0
_For1:
MOV eax,9
CMP eax,dword [v_i]
JL _Next2
; a(i) = i
PUSH dword [v_i]
MOV ebx,dword [v_i]
MOV ebp,dword [a_a]
SAL ebx,2
POP dword [ebp+ebx]
; Next
_NextContinue2:
INC dword [v_i]
JNO _For1
_Next2:
; ================================
; i = 0
MOV dword [v_i],0
; While (9 >= i)
_While3:
MOV ebx,dword [v_i]
CMP ebx,9
JG _Wend3
; a(i) = i
PUSH dword [v_i]
MOV ebx,dword [v_i]
MOV ebp,dword [a_a]
SAL ebx,2
POP dword [ebp+ebx]
; i + 1
INC dword [v_i]
; Wend
JMP _While3
_Wend3:
lg Kevin

http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen