For : Next

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

For : Next

Beitrag von bluejoke »

Hallo!

Ich hab jetzt endlich herausgefunden, weshalb bei mir so eine mysteriöse Fehlermeldung kam:
Compiler hat geschrieben:PureBasic.asm [62];
CMP 7,dword[v_i]
error: invalid operand.
das 62 zeigt anscheinend auf den Ursprung des Fehlers.


Mein fehlerhafter Code (jetzt natürlich nur der ausschlaggebende Teil) war:

Code: Alles auswählen

For [b]i.l=0 To i.l=7[/b]
  Debug i
Next
Richtig ist natürlich

Code: Alles auswählen

For [b]i.l=0 To 7[/b]
  Debug i
Next
Es wäre irgendwie cool, wenn man eine verständlichere Fehlermeldung bringen könnte. Bei "For 0 to 7" kommt ja auch was verstehbares...
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Der PureBasic code wird ja zuerst in ASM Code umgewandelt und dann wird er compilliert. Die Fehlermeldung ist von FASM. In FASM gibts For : Next allerhöchstens als macro.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag von Froggerprogger »

Der PB-Compiler sollte trotzdem einen Syntax Error werfen, da im to-Teil der Schleife kein Gleichheitszeichen erlaubt ist. Das macht er aber nie, auch nicht bei z.B. PeekL(12=8 ).
!UD2
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Naja, also das ist wohl eine der Dinge, die Fred zuletzt beheben sollte, denn es ist ja kein wirklich großes Problem. ;) Macht es denn wirklich soviel aus die Hilfe nach For : Next aufzuschlagen?
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

Ich hatte die Schleifen ja teilweise richtig. Das ist einfach ein Leichtssinnsfehler den man nur schwierig wieder findet.
Ist es wirklich ein so großes Problem die Fehlermeldung zu ändern?
Bei anderen Gelegenheiten gibts ja auch verständliche Hinweise.
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

bluejoke hat geschrieben:Ich hatte die Schleifen ja teilweise richtig. Das ist einfach ein Leichtssinnsfehler den man nur schwierig wieder findet.
Ist es wirklich ein so großes Problem die Fehlermeldung zu ändern?
Bei anderen Gelegenheiten gibts ja auch verständliche Hinweise.
Ja, denn es ist eine FASM Fehlermeldung und keine PB Interne. Also wende dich an die Hersteller von FASM, dass die eine neue speziell für dich angepasste PureBasic FASM version erstellen :P .
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Ne DarkDragon
PureBasic sollte diesen Fehler vorher abfangen oder diesen Vergleich "i.l = 7" richtig auswerten.
Es ist ja nichtmal unbedingt ein Syntaxfehler...

greetz
remi
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag von Froggerprogger »

Es kommt aber nur deswegen zu einer FASM-Fehlermeldung, da PB diesen Fehler nicht abfängt. Es hätte sogar sein können, dass nichtmal ein FASM-Fehler auftaucht, sondern das Programm einfach nur seltsam funktioniert.

Fred müßte seinen Syntax-Check erweitern, was etwas komplizierter sein könnte. Vorteil wäre, dass dann auch Ausdrücke, wie 5 = 2 > 8 abgefangen werden könnten. Da das in PB kein sinnvoller Ausdruck ist, sollte er meiner Meinung nach abgefangen werden.

Ist mir aber auch nicht soo wichtig.

P.S.: Whoops, da war remi schneller.
Was mir wegen remis Post aber noch einfällt (die Diskussion gabs aber schonmal):
Wenn ein boolescher Ausdruck 0 oder 1 zurückgäbe, wäre das sehr cool, dann wäre nach
a = 7 > 3 zum Beispiel a = 1.
!UD2
Caliban
Beiträge: 41
Registriert: 08.09.2004 08:46

Beitrag von Caliban »

Wenn ein boolescher Ausdruck 0 oder 1 zurückgäbe, wäre das sehr cool, dann wäre nach
a = 7 > 3 zum Beispiel a = 1.
Ist doch so oder ?

Code: Alles auswählen

x = 1 < 2
Debug x
x = 1 > 2
Debug x
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag von Froggerprogger »

Nee, das ist manchmal Zufall, dass das klappt. Scheint nur mit Konstanten zu klappen. Wahrscheinlich wird deren Wert einfach zur Compilezeit ausgerechnet. Aber insbesondere geht es nicht mit Variablen:

Code: Alles auswählen

a = 2
x = (a < 1)
Debug x
!UD2
Antworten