Select-Case Bug?
Übersicht

![]() |
M2MBetreff: Select-Case Bug? |
![]() Antworten mit Zitat ![]() |
---|---|---|
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: 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 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hat es denn nun geholfen?
Einfach verschwunden der Kerl ![]() |
||
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus |
![]() |
M2M |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group