Seite 1 von 2
Break in Quad-Select in Schleife in Prozedur = Crash
Verfasst: 02.05.2009 19:35
von Regenduft
Sorry, für den Total bescheidenen Titel, wenn mir jemand 'ne gute Formulierung gibt ändere ich's sofort!
Win XP - PB 4.30 x86
Ich weiß ganicht wie ich's in Worte fassen soll. Am besten ist wohl ein kommentierter Quell-Code:
Code: Alles auswählen
Procedure abc(quady.q)
Repeat
Select quady ; <- This is causing the crash! Using e.g. a long will
; work fine. I originally used a "FileSize" here, so it
; doesn't depend on the usage of a parameter.
Case 0
Debug "case 0 -> no error" ; (no break = no error)
Case 1
Debug "case 1 -> ERROR!"
Break
Default
Debug "case 2 -> ERROR!"
Break
EndSelect
Break
ForEver
EndProcedure ; <- here is where the "Invalid memory
; access. (write at address 0)" appears
abc(0)
abc(1)
abc(2)
Das ganze Tritt scheinbar nur in
genau dieser Konstelation auf! Keine Schleife; kein Fehler. If statt Select; kein Fehler. Long statt Quad; kein Fehler. usw. usf.
Kann den jemand reproduzieren?
Verfasst: 02.05.2009 19:41
von milan1612
Jupp, is reproduzierbar. Poste das ganze mal im englischen Forum, hier bringts nix.
Verfasst: 02.05.2009 19:42
von cxAlex
Liegt am Quad:
http://www.purebasic.fr/german/viewtopi ... c&start=40
Lösung:
Code: Alles auswählen
Macro FakeEndSelect
CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
!POP dword[ESP]
CompilerEndIf
EndMacro
Procedure abc(quady.q)
Repeat
Select quady
Case 0
Debug "case 0 -> no error"
Case 1
Debug "case 1 -> ERROR!"
FakeEndSelect
Break
Default
Debug "case 2 -> ERROR!"
FakeEndSelect
Break
EndSelect
Break
ForEver
EndProcedure
abc(0)
abc(1)
abc(2)
Kann jetzt nicht sagen ob das ein Bug ist, aber es liegt am Stack, da ein Quad unter 32 Bit 2 Anweisungen braucht. Unter 64 Bit sollte es gehen.
Gruß, Alex
Verfasst: 02.05.2009 20:08
von Regenduft
Danke fürs testen
@ milan1612: Ich poste Bugs immer erst hier und nach 'ner Bestätigung ins englische Forum, aber trotzdem Danke für den Hinweis.
@ cxAlex: Uuups? (Habe mir
noch nicht den ganzen von Dir gelinken Thread durchgeschaut) Heißt das
Break ist sozusagen "eine Art"
GoTo? Muss man das genauso vorsichtig handhaben?

Kurz: Ist das ein Fehler meinerseits?
Allgemein ist mir aber aufgefallen (ja... war wohl wieder zu blöd die SF richtig zu benutzen), dass es einen Bug mit Quads und Select seit PB 4.02 und immernoch gibt:
http://www.purebasic.fr/german/viewtopi ... 253#168253
Wenn ich einen der dortigen codes (
link) kompiliere, crasht mir sogar die gesamte IDE! (und laut Thread läuft's auf Mac problemlos...)
*nixblick*

Verfasst: 02.05.2009 20:11
von cxAlex
Hm, scheint dann echt ein Bug zu sein.
Dann mal ab damit ins Englische Forum damit der in 4.4 raus ist !
PS: Ja, Break ist eine Art GoTo.
Verfasst: 02.05.2009 20:21
von milan1612
cxAlex hat geschrieben:PS: Ja, Break ist eine Art GoTo.
Wobei bei Break im Gegensatz zu Goto der Compiler fuers Aufraeumen zustaendig ist

Verfasst: 02.05.2009 20:52
von Regenduft

Gnarf... Ihr 2 macht mich noch ganz duselig im Kopf!

(vielleicht war's aber auch der gelinkte GoTo-Killer-Thread

)
PB-Doku hat geschrieben:Hinweis: Um eine Schleife sicher zu verlassen, sollten Sie immer Break anstelle von Goto verwenden.
und zur Sicherheit nochmal das englische Original:
PB-Doc hat geschrieben:Note: To exit a loop savely, you always should use Break instead of Goto.
(wobei da jetzt kein Wort über Bedingungen steht)
cxAlex hat geschrieben:PS: Ja, Break ist eine Art GoTo.
milan1612 hat geschrieben:Wobei bei Break im Gegensatz zu Goto der Compiler fuers Aufraeumen zustaendig ist

Na also... dann ist es nicht das selbe in grün... sondern eher das gleiche in lila-blassblau mit orangen Hippie-Gummiegänseblümchen drauf... oder so...
Ich post's jetzt in englische forum.
Verfasst: 02.05.2009 23:38
von Kaeru Gaman
die Erklärung von netmaestro erscheint mir einleuchtend:
das Break springt aus der Schleife ohne das Select korrekt zu beenden.
so gehts:
Code: Alles auswählen
Procedure abc(quady.q)
Repeat
Select quady ; <- This is causing the crash! Using e.g. a long will
; work fine. I originally used a "FileSize" here, so it
; doesn't depend on the usage of a parameter.
Case 0
Debug "case 0 -> no error" ; (no break = no error)
Case 1
Debug "case 1 -> ERROR!"
EXIT = 1
Default
Debug "case 2 -> ERROR!"
EXIT = 1
EndSelect
EXIT = 1
Until EXIT
EndProcedure ; <- here is where the "Invalid memory
; access. (write at address 0)" appears
abc(0)
abc(1)
abc(2)
kann sein, dass das Break zwar prüft, ob es in einem select steckt,
dann aber davon ausgeht, dass es sich um ein LONG-select handelt.
deswegen schafft das zusätzliche LONG-POP von cxAlex abhilfe.
Verfasst: 03.05.2009 00:09
von AND51
Das Problem gab es schon vor mindestens einem Jahr und wurde unter anderem breits von mir gepostet, als ich 'entdeckte', dass man auch mit ProcedureReturn nicht aus einem Select-Block springen darf (gleiches Stack-Problem). Ich hatte das Problem bereits zu 3.94er Zeiten, als es noch keine Quads gab.
Verfasst: 03.05.2009 13:02
von tranquil
AND51 hat geschrieben:Das Problem gab es schon vor mindestens einem Jahr und wurde unter anderem breits von mir gepostet, als ich 'entdeckte', dass man auch mit ProcedureReturn nicht aus einem Select-Block springen darf (gleiches Stack-Problem). Ich hatte das Problem bereits zu 3.94er Zeiten, als es noch keine Quads gab.
Darf man nicht? Verdammt! Warum wird das nirgends dokumentiert? Ich bin davon ausgegangen das ProcedureReturn den Stack, egal wo ich aus der Prozedure springe, aufräumt. :-/
Wozu haben wir denn nun die Compiler warnings wenn soetwas nicht gewarnt wird? Nun heißt es Sources überarbeiten..... :P