Select-Case Bug?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

M2M

Betreff: Select-Case Bug?

BeitragSa, Jan 08, 2011 1:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Abend zusammen,

ich schraube seit Ewigkeiten an einem Editor für ein Spiel herum.. Hänge aber an einem (für mich) seltsamen Problem...

Im Editor-internen Skripteditor gebe ich meine Spielskripte ein und kann dannach auf Ausführen klicken und der Parser durchforstet Zeile für Zeile des Skripts und sucht nach bekannten Befehlen und versucht diese dann auszuführen. Soweit funktioniert das auch bei manchen Befehlen, nur jetzt das Problem: Kommt ein Befehl ein paar mal vor, dann erkennt er sporadisch manchmal nur ein, zwei, manchmal aber auch alle, oder nur die Hälfte usw.

Zwei Beispielbilder:
user posted image
user posted image

Auf dem ersten Bild sieht man das geschriebene Skript. Der Befehl "SAY" kommt 7 mal vor, dazwischen ein "PRINT" Befehl den ihr nicht weiter beachten sollt.

Das zweite Bild zeigt die Konsole mit DEBUG-Modus, deshalb die Zeilennummern.
Wie man sieht funktioniert das ganz toll, bis zum "HAHAHAH" , also dem "SAY"-Befehl in Zeile 9. Alle Befehle dannach kommen nicht mehr an, sind aber zweifelsfrei richtig geschrieben.


Um die Befehle herauszufiltern verwende ich einen String-Zerleger innerhalb einer Select-Case Anweisung.

BlitzBasic: [AUSKLAPPEN]
If Len(myscript.LINEVALUE[ln]) >= 0
If DEBUGMODE = 1 Then __DEBUG(Between(myscript.LINEVALUE[ln],Null," "))

Select Upper(Bet(myscript.LINEVALUE[ln],Null," "))


Case "SAY"
If Bet(myscript.LINEVALUE[ln],"'","'") = Null
__DEBUG("Error in command --SAY-- : Missing ' ")
Else
If AfterLast(myscript.LINEVALUE[ln],"'") = ";"
Print Bet(myscript.LINEVALUE[ln],"'","'")
PARSE_SUCCESS = 1
__DEBUG(Bet(myscript.LINEVALUE[ln],"'","'"))
Else
__DEBUG("Error in command --SAY-- : Missing ' at end")
EndIf
EndIf

Erklärung:
Die Bet() Funktion sucht mir alles zwischen Parameter 2 und 3, also in dem Befehl zwischen dem ersten Hochkomma und dem Zweiten. Die AfterLast() Funktion sucht das letzte Zeichen nach Parameter 2, also das letzte Zeichen nach dem zweiten Hochkomma.

Das die Befehle erkannt werden zeigt ja die Konsole, nur warum werden nicht alle erkannt??
Wenn man die zweite Zeile des Codes betrachtet (falls der Debugmode an ist) dann steht immer (!) der erkannte Befehl in der Konsole, aber der Case tritt nicht immer ein.

Wer kann mir irgendwie weiterhelfen? Danke euch

TimBo

BeitragSa, Jan 08, 2011 1:32
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn es in BMAX sowas wie Stop gibt, dann würde ich das mal machen und dann Zeile für Zeile mit dem Bmax Debugger durchkauen und schauen, welchen Wert die selektierte Var hat.
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

M2M

BeitragSa, Jan 08, 2011 2:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm, habe ich schon etliche Male versucht.. Alle Variablen stimmen ja, die Konsole erkennt im Debugmodus die Befehle auch (also der Rückgabewert den der String-Zerleger liefert ist immer der Befehl.., allerdings wird er nicht weiterverarbeitet..)..

TimBo

BeitragSa, Jan 08, 2011 2:45
Antworten mit Zitat
Benutzer-Profile anzeigen
also Upper(Bet(myscript.LINEVALUE[ln],Null," ")) ist immer SAY ?
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

mpmxyz

BeitragSa, Jan 08, 2011 2:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei solchen Fällen gibt es nur eine Lösung:
Noch mehr debuggen!
Du musst wirklich Schritt für Schritt dir die Werte vor und nach jeder Operation ansehen und mit dem vergleichen, was du haben möchtest.
Bei solchen Härtefällen steckt nicht selten ein ganz kleiner, aber gut versteckter Fehler.
Debugge jeden Code, der damit nur im Entferntesten zu tun hat. Dort kann der Fehler auch liegen!
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Hummelpups

BeitragSa, Jan 08, 2011 10:08
Antworten mit Zitat
Benutzer-Profile anzeigen
nu nutzt 2 verschiedene Befehle für between? bet und between?
Code: [AUSKLAPPEN]
If Len(myscript.LINEVALUE[ln]) >= 0
   If DEBUGMODE = 1 Then __DEBUG(Between(myscript.LINEVALUE[ln],Null," "))
   
   Print ln+">"+Between(myscript.LINEVALUE[ln],Null," ")+"_"
   Print ln+">"+Upper(Bet(myscript.LINEVALUE[ln],Null," ")+"_"
   
   Select Upper(Bet(myscript.LINEVALUE[ln],Null," "))
      
   
      Case "SAY"
         __DEBUG("in case SAY")      
         If Bet(myscript.LINEVALUE[ln],"'","'") = Null
            __DEBUG("Error in command --SAY-- : Missing ' ")
         Else
            If AfterLast(myscript.LINEVALUE[ln],"'") = ";"
               Print Bet(myscript.LINEVALUE[ln],"'","'")
               PARSE_SUCCESS = 1
               __DEBUG(Bet(myscript.LINEVALUE[ln],"'","'"))
            Else
               __DEBUG("Error in command --SAY-- : Missing ' at end")
            EndIf
         EndIf


Für das mal aus.
Außerdem parst du auch Lines die null Zeichen haben. Len>0
sollte es heißen.

Und wie gesagt:
ganz unabhängig davon sieht das Befehls und Parameterparsing
echt schrecklich aus. Warum nutzt du nicht lua? Das gibts schon und
man muss nichts neues basteln ;D

Wenn es sowieso nur einen Befehl pro Zeile gibt, ist der Kram mit
dem semicolon wohl überflüssig.



EDIT// Und weil ich heute nen netter bin noch ein bissl lua gebamsel:
Code: [AUSKLAPPEN]
Framework zeke.luajit2
Import brl.standardio

Local LuaVM:Byte Ptr=luaL_newstate()
luaL_openlibs(LuaVM)
lua_register(LuaVM,"SAY",luaPrint)

Local code:String[10]

code[0]="x=~qHallo~q;"
code[1]="y=~q Welt~q;"
code[2]="SAY(x..y);"

For Local i:Int=0 To 9
   if code[i]="" continue
   luaL_dostring(LuaVM, code[i])
Next


Function luaPrint:Int(luaVM:Byte Ptr)
   Print luaL_checkstring(luaVM,1)
End Function

Hummelpups

BeitragMo, Jan 10, 2011 15:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hat es denn nun geholfen?

Einfach verschwunden der Kerl Laughing
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus

M2M

BeitragMo, Jan 10, 2011 22:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey sorry, ne ich hab nur wenig Zeit..

Also ne, hat nichts gebracht.. Fehler treten immernoch sporadisch auf.. Werd jetzt nochmal ne Woche oder so eifrig den Fehler suchen ansonsten werd ich mir wohl oder übel eine andere Lösung einfallen lassen müssen. Danke soweit

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group