For Next Schleife mit Array

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
rolaf
Beiträge: 3843
Registriert: 10.03.2005 14:01

Re: For Next Schleife mit Array

Beitrag von rolaf »

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))
Hey NicTheQuick, klasse dein Workaround. :allright: :allright: :allright:
:::: WIN 10 :: PB 5.73 :: (x64) ::::
Benutzeravatar
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

Beitrag von NicTheQuick »

ts-soft hat geschrieben:@NicTheQuick
Wenn Du schon hier liest, hättest Du die Bugs aber auch gleich melden können :wink:
Solange ich meine Lieblingsprogrammiersprache nicht pjurbesic sondern purebasic mit langem e ausspreche,
bin ich dafür nicht geeignet :mrgreen:
Hm...
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. :D
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: For Next Schleife mit Array

Beitrag von STARGÅTE »

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.
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
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: For Next Schleife mit Array

Beitrag von Nino »

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 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.
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
Benutzeravatar
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

Beitrag von ts-soft »

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
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.
Bild
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: For Next Schleife mit Array

Beitrag von Danilo »

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!?)
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
rolaf
Beiträge: 3843
Registriert: 10.03.2005 14:01

Re: For Next Schleife mit Array

Beitrag von rolaf »

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!?)
Danke und Nö. :wink:
:::: WIN 10 :: PB 5.73 :: (x64) ::::
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: For Next Schleife mit Array

Beitrag von 7x7 »

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

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
Benutzeravatar
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

Beitrag von ts-soft »

7x7 hat geschrieben:Von solch einer Optimierung macht PureBasic aber keinen Gebrauch.
So so :freak:

/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.
Bild
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: For Next Schleife mit Array

Beitrag von CSHW89 »

ts-soft hat geschrieben:
7x7 hat geschrieben:Von solch einer Optimierung macht PureBasic aber keinen Gebrauch.
So so :freak:
Das dachte ich eigentlich auch. Allerdings muss ich da 7x7 recht geben:

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:
For und While resultieren zum selben Code, außer dass die Grenzenprüfung andersrum ist. Aber die Zählvariable wird in keinem Register gespeichert.

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