For-Schleife - variables Step?

Für allgemeine Fragen zur Programmierung mit PureBasic.
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Beitrag von GPI »

MARTIN hat geschrieben:Das ist kein Pfusch. Auch in C ist sowas zulässig:
Schön, aber man sollte da gewaltig aufpassen, da es eine ungeheure Gefahrenquelle ist.

Die Variablen in For-Next sollte nach möglichkeit nicht manipuliert werden, da es bei späterer Fehlersuche erhebliche Probleme machen kann.

Erlaubt ist es natürlich, aber man sollte nicht alles machen, was erlaubt ist.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
MARTIN
Beiträge: 454
Registriert: 08.09.2004 14:03
Wohnort: Kiel

Beitrag von MARTIN »

@GPI
Es kommt sicher mehr auf den Programierer an, ob ein variabler Schritt in einer For-Schleife eine Gefahrenquelle ist.
Also ich habe solche konstruktion nie benutzt , (ausser für rekursive Folgen wie in meinem Beispiel) aber ich erkenne da eigentlich keine grosse Gefahren bei richtiger Handhabung.
Meinst vielleicht Du dass die For-Schleife dann unerwartete Werte liefern kann ?
Oder welche Problemme sind da zu erwarten ?

@honk
Habe auch daran gedacht. Warum akzeptiert PureBasic in Select-Case Anweisung eine Variable und in For-Next Schleife nicht.

Und in C ist es genau andersrum. Zufall ?
Amilo 1667|Suse Linux 10.1_64bit/WinXP |PB 4.00/3.94
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

MARTIN hat geschrieben:@honk
Habe auch daran gedacht. Warum akzeptiert PureBasic in Select-Case Anweisung eine Variable und in For-Next Schleife nicht.
Und in C ist es genau andersrum. Zufall ?

Auch in GFA ist es nicht viel anders wie in C/C++
GB32-Hilfe hat geschrieben:Select iexp
Case intConst
Case intConst To intConst
Case To intConst
Case intConst To
Case = intConst
Case > intConst
Case < intConst
Case >= intConst
Case <= intConst
Case <> intConst
EndSelect

Select Case exp
Case Const
Case Const To Const
Case To Const
Case Const To
Case = Const
Case > Const
Case < Const
Case >= Const
Case <= Const
Case <> Const
EndSelect

weitgehend wie 16 Bit GFA-BASIC
und hier noch mal aus der Hilfe
GB32-Hilfe hat geschrieben:For var = startwert To endwert
For var = startwert UpTo endwert
For var = startwert DownTo endwert
For var = startwert To endwert Step schrittweite
For var = startwert UpTo endwert Step schrittweite
For var = startwert DownTo endwert Step schrittweite
Next var
Next

Die Zählschleife weist einer Variablen var einen startwert zu. Nach jedem Durchlauf der Schleife, gebildet von For und Next, wird diese Variable erhöht (um Step bzw. um 1), dann wird var mit dem endwert verglichen. Bis der endwert überschritten wird, wird die Schleife durchlaufen. Bei Angabe von negativem Step (bzw. Downto ohne Step) gilt der endwert als überschritten, wenn der Schleifenzähler var den endwert unterschreitet. Einige Beispiele:

For i = 1 To 10 : Print i; : Next // 1 2 3 4 5 6 7 8 9 10
For i = 10 DownTo 1 : Print i; : Next // 10 9 8 7 6 5 4 3 2 1
For i = 1 UpTo 10 : Print i; : Next // 1 2 3 4 5 6 7 8 9 10
For i = 1 To 10 Step 1: Print i; : Next // 1 2 3 4 5 6 7 8 9 10
For i = 10 To 1 Step -1: Print i; : Next // 10 9 8 7 6 5 4 3 2 1
For i = 1 UpTo 10 Step 1: Print i; : Next // 1 2 3 4 5 6 7 8 9 10
For i = 10 DownTo 1 Step -1: Print i; : Next // 10 9 8 7 6 5 4 3 2 1
For i = 1 To 10 Step 2: Print i; : Next // 1 3 5 7 9

For i = 10 To 1 Step -2: Print i; : Next // 10 8 6 4 2
For i = 1 UpTo 10 Step 2: Print i; : Next // 1 3 5 7 9
For i = 10 DownTo 1 Step -2: Print i; : Next // 10 8 6 4 2

Zwischen For - To - Step und For - UpTo - Step bzw. For - DownTo - Step gibt es nur einen kleinen Unterschied. Da bei For - To - Step die Schleifenzählrichtung nicht bekannt ist (jedenfalls wenn der Wert hinter Step keine Konstante ist), muß das GFA-BASIC 32 abhängig vom Vorzeichen der Schrittweite zwei verschiedene Vergleiche zwischen var und endwert durchführen, und zwar var > endwert für schrittweite >= 0 und var < endwert für schrittweite < 0. Mit UpTo bzw. DownTo kann man angeben, welcher dieser Vergleiche tatsächlich notwendig ist. Der andere, nie ausgeführte Vergleich, erzeugt so auch keinen extra Programmcode. Dies führt neben der Platzersparnis zu einer geringfügigen Beschleunigung des Programmes. Außerdem sind UpTo x Step y und DownTo x Step y auch ein klein wenig leichter verständlich.

Die For-Next Schleife ist eine abweisende Schleife, d. h. wenn startwert den endwert überschreitet, wird die Schleife kein einziges Mal durchlaufen.
Bild
Win11 Pro 64-Bit, PB_6.11b1
honk
Beiträge: 6
Registriert: 20.09.2004 18:57
Wohnort: leider hier
Kontaktdaten:

Beitrag von honk »

Jedenfalls wollte ich sagen, wenn PB bei CASE Variablen akzeptiert,
dann sollte das meiner Meinung nach auch bei STEP so sein,
da das einer "Basic"-Sprache ja wohl eher entspricht.
Man soll ja schließlich weniger und verständlicheren Code schreiben können als bsw. in C.

Hat sonst noch niemand von dem CASE-VAR Feature von PB gebrauch gemacht?
Als ich sowas in C machen wollte war ich mehr als enttäuscht, weil eine
der einfachsten Sachen der Welt nicht funktioniert, eine die in PB funzt :lol:
Um eine berechnete Variable mit 4 anderen berechneten Vars zu
vergleichen musste ich dann IF-ELSE-Schachteln basteln,
3mal längerer Code... dauert 3mal länger zu lesen/verstehen... geiles Feature :allright:
Ich Frage mich ernsthaft wozu SWITCH-CASE in C gut sein soll ...
natürlich für "konstanten", statischen und unflexiblen Code LOL

Mein persönliches FAZIT:
CASE mit Variablen rult!!!
STEP mit Variablen würde ganz genauso rulen!!!
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag von Andre »

Rückinfo von Fred: die (zukünftige) Unterstützung von Variablen als Step-Parameter ist vorgesehen... :D
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
honk
Beiträge: 6
Registriert: 20.09.2004 18:57
Wohnort: leider hier
Kontaktdaten:

Beitrag von honk »

ah trés bien :D
Benutzeravatar
redacid
Beiträge: 581
Registriert: 29.08.2004 17:06

Beitrag von redacid »

Andre hat geschrieben:Rückinfo von Fred: die (zukünftige) Unterstützung von Variablen als Step-Parameter ist vorgesehen... :D
Für V4 oder erst V5? 8)
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag von Andre »

redacid hat geschrieben:
Andre hat geschrieben:Rückinfo von Fred: die (zukünftige) Unterstützung von Variablen als Step-Parameter ist vorgesehen... :D
Für V4 oder erst V5? 8)
Naja, nichts genaues weiß man nicht... :mrgreen:
(weiß zu diesem Punkt wirklich nichts genaues, für v4 müsste man halt etwas drängeln :wink:)
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

also, ich möchte mich hier der "konservativen" linie anschliessen...

... die step innnerhalb der schleife zu verändern war vielleicht auf dem C64 notwendig, wo es einfach keine anderen schleifen GAB (ausser man machte sowas mit if..goto)

für veränderliche stepgrössen in EINEM durchlauf bevorzuge ich hier auch While/Wend oder Repeat/Until

... und ich finde das andere auch unübersichtlich und irgendwie fishy...

ANDERERSEITS mag es notwendig sein, die step-grösse VOR dem schleifendurchlauf festzulegen und nicht zur programmierzeit... dafür ist eine implementierung von Step Var wünschenswert.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten