For-Schleife - variables Step?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

Nur, in einer For-Schleife ist die Variable integriert und wird von der Schleife selbstständig erhöht. Bei der While-Schleife ist die Variable eine normale Variabel welche durch While nicht beeinflusst wird. Da ist das Risiko, dass etwas passiert mit der Zähler-Variable wesentlich geringer.
Benutzeravatar
MLK
Beiträge: 267
Registriert: 01.11.2004 13:17
Wohnort: Hamburg

Beitrag von MLK »

das etwas "passiert" ?

schau dir mal den ASM output einer FOR schleife an. da passiert nix anderes, als das am ende der schleife die zählvariable um den jeweiligen stepwert erhöht wird. wenn man da noch was drauf packt, dann ist es das selbe was PB auch machen würde. wenn du meinen code nicht magst - ok, aber schreib doch keinen unsinn.
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 »

sorry, wäre es nicht besser Fred nocheinmal nachzufragen,
ob er den STEP auch als Variable einbauen kann. Vor einem Jahr
war schon mal diese Diskusion (siehe englisches Forum). Ob man das
so oder so machen kann ist eigendlich egal. Hauptsache es ist in "Basic als auch PureBasic" ohne irgendwelche Umwege einfach einzusetzen.

Ich glaube, Andre hatte Fred vor einem Jahr darauf hingewiesen. Finde leider den Thread nicht auf die schnelle :mrgreen:

In GFA-Basic brauchte man wegen variablen STEP nicht Diskutieren.
Das läuft und ist übersichtlicher!
GFA-Basic (16-Bit) hat geschrieben:Besucher = 100 /* z.B jeder hundertste Besucher
FOR i = 1 TO 2000 STEP Besucher
PRINT "Besuchernr: ";i
NEXT i
GB32 (32-Bit) hat geschrieben:OpenW Top 1, 100, 100, 600, 400
Local x%, i%, Besucher%
Besucher% = 100 /* z.B jeder hundertste Besucher
For i% = 1 To 2000 Step Besucher%
Print "Besuchernr: " + Str$(i%)
Next i%
KeyGet x%
CloseW 1
Vor allem kann man auch dann noch innerhalb der Schleife die Variable trotzdem ändern und dadurch den STEP beeinflussen.


MfG Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Beitrag von GPI »

Falko hat geschrieben:Vor allem kann man auch dann noch innerhalb der Schleife die Variable trotzdem ändern und dadurch den STEP beeinflussen.
Du meinst, wenn die die Variable Besucher in obrigen Beispiel ändert, ändert sich auch der Step beim nächsten durchlauf?

DAS würde ich bei einer sauberen Programmierung sein lassen...
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

schau dir mal den ASM output einer FOR schleife an. da passiert nix anderes, als das am ende der schleife die zählvariable um den jeweiligen stepwert erhöht wird. wenn man da noch was drauf packt, dann ist es das selbe was PB auch machen würde. wenn du meinen code nicht magst - ok, aber schreib doch keinen unsinn.
Ich weiß wirklich nicht wie der ASM Code letzten Endes bei einer For-Schleife aussieht, aber vor ein paar Versionen war es in PureBasic noch versagt, (beabsichtigt) dass der User die Zählervariable der For-Schleife ändern kann. Also da kam es zu einem Absturz bzw. einer Fehlermeldung bei eingeschaltetem Debugger wodurch ich darauf schloss, dass die Variable irgendwie involviert ist und dieser Speicherbereich nicht geändert werden darf. In wie fern man nun den Zähler ändern kann wie man will weiß ich nicht, nur wer weiß, ob sich dieses Verhalten in PB nicht nochmal ändert. Ich hab im Hinterkopf, dass man mal die Zählervariable ändern konnte, dann das Update daraufhin nicht mehr, und jetzt wieder (wobei ich es so wie jetzt gut finde). Bei einer While ist die Variable zu 100% nicht an die Schleife gebunden und somit unabhängig von Updates und Änderungen im Schleifenverhalten.
Wie auch immer, beide Varianten stehen zur Wahl und man möge sich diejenige aussuchen welche einem besser gefällt. Warten wir ab was sich in Sachen For noch tun wird. ;)
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 »

@GPI
Genau das meinte ich. Wenn ich mit einer simplen FOR/NEXT/STEP - Schleife nur Ausgaben machen will, wo jeder 10'te, 100'te oder
x'te Besucher entweder Ausgedruckt bzw. in der Bildschirmausgabe angezeigt werden soll. Diese Schleife käme dann in einer Procedure hinein.
Warum ist das keine saubere Programmierung?
Ich sähe im Moment keine Nachteile dadurch.

MfG Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
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 »

@Falko: habe Fred heute nachmittag nochmal per Mail angefragt, ob eine (zukünftige) Unterstützung von Variablen als Step-Parameter geplant ist. Gebe Bescheid, wenn ich näheres weiß...
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
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 »

@Andre
Das wäre prima, wenn Fred das anpassen würde.
Danke Andre. :allright:

Gruß Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
MARTIN
Beiträge: 454
Registriert: 08.09.2004 14:03
Wohnort: Kiel

Beitrag von MARTIN »

GPI hat geschrieben:Weil das Pfusch ist und eine unsaubere Methode.
Das ist kein Pfusch. Auch in C ist sowas zulässig:

Code: Alles auswählen

#include <stdio.h>

main()
{
  int a,b=0;
  for(a=0;a<100;a=a+b)/*<<--Variabler Schritt*/
  {
     printf("a=%d  b=%d\n",a,b);
     b++;
  }
}
PureBasic unterstüzt das einfach nicht.
Amilo 1667|Suse Linux 10.1_64bit/WinXP |PB 4.00/3.94
honk
Beiträge: 6
Registriert: 20.09.2004 18:57
Wohnort: leider hier
Kontaktdaten:

Beitrag von honk »

hm dazu fällt mir jetzt ein genau umgekehrtes Beispiel ein:
PB akzeptiert Variablen fürs CASE (was sehr komfortabel ist)

Code: Alles auswählen

Select was_machen.l
  Case dies.l
    ; Mach dieses
  Case jenes.l
    ; Mach jenes
EndSelect
aber C nur Konstanten? :shock: (was extrem unkomfortabel ist)

Code: Alles auswählen

switch ( was_machen )
{
  case 123 : // Mach 123
  case 456 : // Mach 456
}
Hoffentlich erzähle ich keinen Unsinn, denn sonst ist da was an mir vorbei gegangen und/oder ich benutze den falschen Compiler :mrgreen:
Antworten