PBScript - Scriptsprache mit PureBasic-Syntax

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: PBScript - Scriptsprache mit PureBasic-Syntax

Beitrag von CSHW89 »

vielleicht so:

Code: Alles auswählen

Define string.s, string2.s
Define *bytecode, *bytecode2
Define vartype.PBSVarType

; Script 1:
string = #LF$
string + "Global val=0"+#LF$
string + #LF$
string + "While Quit=0"+#LF$
string + "  For t=0 To 10 : Next"+#LF$
string + "  val+1"+#LF$
string + "Wend"+#LF$

; Script 2:
string2 = #LF$
string2 + "For t=0 To 60000 : Next"+#LF$
string2 + "Quit=1"+#LF$

; Globale Variable Quit für alle Scripts bereitstellen
vartype\type = #PBSType_Integer
PBSCompilerAddVariable("Quit",vartype)

; Threadstart-Procedure
Procedure Start(wert)
  PBSStartByteCode(wert)
  Debug "Script "+Str(wert)+" beendet."
EndProcedure

; Script 1 kompilieren
*bytecode = PBSCompileScriptString(string)
If (*bytecode = #Null)
  MessageRequester("Compiler-Error", PBSGetErrorText())
  End
EndIf

; Script 2 kompilieren
*bytecode2 = PBSCompileScriptString(string2)
If (*bytecode2 = #Null)
  MessageRequester("Compiler-Error", PBSGetErrorText())
  End
EndIf

; Script 1 starten
PBSOpenByteMemory(0, *bytecode)
t1=CreateThread(@Start(),0)
Debug "Script 0 gestartet."

; Script 2 starten
PBSOpenByteMemory(1,*bytecode2)
t2=CreateThread(@Start(),1)
Debug "Script 1 gestartet."

Repeat
  If (PBSGetVariableInteger(1, "Quit") = 1)
    PBSSetVariableInteger(0, "Quit", 1)
  EndIf
  Delay(10)
ForEver

PBSCloseByteScript(1)
PBSCloseByteScript(0)

End
lg kevin

edit: so könnte man das z.b. mit jeder globalen variable machen:

Code: Alles auswählen

Global quit
Repeat
  For i = 0 To #AnzahlScript-1
    If (PBSGetVariableInteger(i, "quit") <> quit)
      quit = PBSGetVariableInteger(i, "quit")
      For k = 0 To #AnzahlScript-1
        If (k <> i)
          PBSSetVariableInteger(k, "quit", quit)
        EndIf
      Next
    EndIf
  Next
  Delay(20)
ForEver
bei jeder veränderung in einem script, wird die variable in den anderen scripen geändert
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
MightyMAC
Beiträge: 55
Registriert: 07.01.2007 18:11
Wohnort: Duisburg
Kontaktdaten:

Re: PBScript - Scriptsprache mit PureBasic-Syntax

Beitrag von MightyMAC »

Ja, ähm... genau so. Danke. Keep up the good work ... wie der Angel-sachse so sagen tut. :wink:
Windows XP 32-bit SP3, Windows 7 64-bit, PB 4.60, PB 5.11, PB 5.20
MightyMAC
Beiträge: 55
Registriert: 07.01.2007 18:11
Wohnort: Duisburg
Kontaktdaten:

Re: PBScript - Scriptsprache mit PureBasic-Syntax

Beitrag von MightyMAC »

Ich habe gestern mal angefangen mein selbstgemachtes Scriptsystem zu verschrotten und durch PBScript zu ersetzen. Ich habe da einige Probleme mit optionalen Parametern von Proceduren. Ich habe beispielsweise folgende Procedure:

Code: Alles auswählen

Procedure Talk(Name.s,Text.s,Soundfile.s="")
also mit optionalem Soundfile den man angeben kann, wenn ich jetzt aber in einem Script

Code: Alles auswählen

Talk("Ninja","Hallo, wie gehts?")
einbaue, ist der Wert für Soundfile gleich dem Textwert, das Programm versucht jetzt also dauernd ein Soundfile mit dem Namen "Hallo, wie gehts?" zu laden. Wenn ich

Code: Alles auswählen

Talk("Ninja","Hallo, wie gehts?","")
angebe funktioniert's.

Ausserdem ist die Fehlersuche etwas mühsam, wenn man 10 Scripts laufen hat und in einem ist ein Fehler. Besteht die Möglichkeit etwas einzubauen um den fehlerhaften Script zu identifizieren, z.B. etwas wie "PBSGetErrorScript()"?

Gruß
MAC
Windows XP 32-bit SP3, Windows 7 64-bit, PB 4.60, PB 5.11, PB 5.20
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: PBScript - Scriptsprache mit PureBasic-Syntax

Beitrag von CSHW89 »

Hi, das mit dem optionalen Parameter war ein kleiner dummer fehler in fast 10000 zeilen code :bluescreen: . sorry dafür.
Wird so schnell wie möglich gefixt. ich wollt eh in der nächsten zeit ne neue version rausbringen. dann kommt die halt ein bisschen früher. ;)

tja und das mit der fehleranalyse is eh nicht so besonders gut, geb ich zu, vorallem bei multithreadbenutzung. weiß auch nicht so ganz, wie ich das besser machen kann. das mit 'PBSGetErrorScript()' ist aber schonmal eine gute idee :allright: . wird gemacht.

ich hoffe, ich kann die version heute noch rausbringen, ansonsten morgen.

lg kevin
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: PBScript - Scriptsprache mit PureBasic-Syntax

Beitrag von CSHW89 »

Version alpha 0.55:
- (NEU) PBSGetScriptSize()
- (NEU) PBSGetErrorScript()

Im Script:
- (NEU) Data / DataSection
- (NEU) Read / Restore
- (NEU) Sprungmarken
- Bugfix (optionaler String-Parameter ;) )

lg kevin
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
MightyMAC
Beiträge: 55
Registriert: 07.01.2007 18:11
Wohnort: Duisburg
Kontaktdaten:

Re: PBScript - Scriptsprache mit PureBasic-Syntax

Beitrag von MightyMAC »

Danke, das mit den optionalen Parametern läuft jetzt vorzüglich. :D

Gibt es eine Möglichkeit einer Procedure im Hauptprogramm zu übermitteln von welchem Script sie aufgerufen wurde? So eine Art "PBSCalledByScript()", oder so? Das wäre äußerst hilfreich. Eine Auflistung der in PBScript eingebauten nativen PureBasic-Funktionen in der Dokumentation wäre auch nicht schlecht. Einige hast du ja hier im Thread genannt, aber in der Hilfe steht davon nichts (oder habe ich die einfach übersehen?).

EDIT: Gerade ist mir noch was aufgefallen. Wenn ich mit PBSSetVariableString() einen String übergeben will, der zwar definiert ist, dem aber nie ein Wert zugewiesen wurde, gibt's einen Absturz. Also wenn ich z.B.

Code: Alles auswählen

Global Teststring.s
.
.
.
PBSSetVariableString(Script, Teststring)
benutze, dann schmiert's ab, wenn ich aber

Code: Alles auswählen

Global Teststring.s=""
.
.
.
PBSSetVariableString(Script, Teststring)
benutze funktioniert's. (Selbstverständlich sind die Variablen vorher mit PBSCompilerAddVariable() hinzugefügt)

Gruß
MAC
Windows XP 32-bit SP3, Windows 7 64-bit, PB 4.60, PB 5.11, PB 5.20
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: PBScript - Scriptsprache mit PureBasic-Syntax

Beitrag von CSHW89 »

So, es hat ein bisschen länger gedauert, als ich dachte. Vorallem das neue Error-Callback-System hatte mir Kopfschmerzen bereitet. Ich denke aber, das sollte jetzt alles funktionieren. Wenn beispielsweise mehrere Scripte gleichzeitig laufen, und alle einen Fehler produzieren, können alle seperat abgehandelt werden, und keiner geht verloren (siehe dazu Beispiel in der Hilfe PBSSetErrorCallback()).
MightyMAC hat geschrieben:So eine Art "PBSCalledByScript()"
Ist jetzt auch drin, allerdings mit dem Namen PBSGetCurrentScript(). Auch dazu gibt es ein Beispiel in der Hilfe.

Hier nochmal im Detail
Version alpha 0.60:
- (NEU) PBSGetCurrentScript() zur Bestimmung des Scriptes, das gerade läuft
- (NEU) Error-Callback-System: PBSSetErrorCallback()

Im Script:
- Bugfix (PBSSetVariableString() mit nicht initialisiertem String)
- Bugfix (PBSSetProcedureAdress() mit #PB_Default hatte schon wieder nicht funktioniert :roll: )

lg kevin
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
MightyMAC
Beiträge: 55
Registriert: 07.01.2007 18:11
Wohnort: Duisburg
Kontaktdaten:

Re: PBScript - Scriptsprache mit PureBasic-Syntax

Beitrag von MightyMAC »

Hi,

ich habe PBScript mittlerweile vollständig in mein Projekt integriert und es läuft tadellos. Eine wirklich tolle Sache. :D

In der Zwischenzeit habe ich mir Gedanken zum Speichern und Laden von Spielständen gemacht. Hast du eine Idee wie ich ein Script an der Stelle fortsetzen kann an der es beim letzten mal unterbrochen wurde, oder könntest du dir vorstellen Funktionen einzubinden mit denen man ein laufendes Scripts speichern kann um es hinterher wieder zu laden und es fort zu setzen? Stelle ich mir gerade bei laufenden Schleifen etwas kompliziert vor...

Gruß
MAC
Windows XP 32-bit SP3, Windows 7 64-bit, PB 4.60, PB 5.11, PB 5.20
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: PBScript - Scriptsprache mit PureBasic-Syntax

Beitrag von CSHW89 »

MightyMAC hat geschrieben:Eine wirklich tolle Sache. :D
Danke :)

Hm, erster Gedanke wäre, kein Code außerhalb einer Procedure zu schreiben. Um das Script zu starten, kann man dann eine Procedure aufrufen, sowas z.b.:
statt

Code: Alles auswählen

Repeat
  block
ForEver
das hier:

Code: Alles auswählen

Procedure main()
  block
EndProcedure
und außerhalb des Scriptes dann:

Code: Alles auswählen

Repeat
  PBSCallProcedure(0, "main", value.PBSValue)
ForEver
Dann kannst du außerhalb steuern, ob das Script weiter ausgeführt werden soll.
Das Laden und Speichern, hm, naja da muss ich mal gucken. Z.Z. stell ich ja genug Funktionen zur Verfügung, um die Werte alle globalen Variablen auszulesen. Hm, mal sehen, vielleicht kann ich das noch erweitern.

lg kevin
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: PBScript - Scriptsprache mit PureBasic-Syntax

Beitrag von STARGÅTE »

Tachchen CSHW89,

experimentiere gerade mit deiner UserLib ... aber schon am Anfang scheint irgendwas nicht zu stimmen:

Deine Scriptsprache schein Probleme mit Typenumwandlung zu haben ? und Floats überhaupt nicht zu mögen:
Irgendwie ignoriert er den ProcedureReturn-Typ

Code: Alles auswählen

*ByteCode = PBSCompileScriptString("Procedure.f Test() : ProcedureReturn 3.14 : EndProcedure")
Value.PBSValue\type = #PBSType_Float
PBSCallProcedure(PBSOpenByteMemory(#PB_Any, *ByteCode), "Test", Value)
Debug Value\float
Debug Value\double
Debug Value\integer
Debug "---"

*ByteCode = PBSCompileScriptString("Procedure.d Test() : ProcedureReturn 3 : EndProcedure")
Value.PBSValue\type = #PBSType_Double
PBSCallProcedure(PBSOpenByteMemory(#PB_Any, *ByteCode), "Test", Value)
Debug Value\float
Debug Value\double
Debug Value\integer
Debug "---"

*ByteCode = PBSCompileScriptString("Procedure.i Test() : ProcedureReturn 2*0.5 : EndProcedure")
Value.PBSValue\type = #PBSType_Integer
PBSCallProcedure(PBSOpenByteMemory(#PB_Any, *ByteCode), "Test", Value)
Debug Value\float
Debug Value\double
Debug Value\integer
Debug "---"
Muss ich die Typenumwandlung seber durchführen, oder ist das noch n Bug ?

Desweiteren habe ich das Gefühl das der ByteCode den du erstellst, bzw das Script-Element irgendwie noch sehr langsam arbeiten ...
Bitte nicht falsch verstehen, es handelt sich hier nicht um Minuten ^^ aber gerade wenn es nur darum geht einfach nur eine Zahl zurück zu geben braucht der Code "relativ" lange, wo ich nicht ganz verstehe, was der da macht, was so lange dauern kann.
Hier mal ein Beispiel:

Code: Alles auswählen

#Size1 = 10000
#Size2 = 10000000

*ByteCode = PBSCompileScriptString("Procedure.i Test() : ProcedureReturn 10+20 : EndProcedure")
S = PBSOpenByteMemory(#PB_Any, *ByteCode)

Time = ElapsedMilliseconds()
For n = 1 To #Size1
 PBSCallProcedure(S, "Test", 0)
Next
Time1 = ElapsedMilliseconds()-Time

Procedure.i Test()
  ProcedureReturn 10+20
EndProcedure

Time = ElapsedMilliseconds()
For n = 1 To #Size2
  Test()
Next
Time2 = ElapsedMilliseconds()-Time

MessageRequester("Testergebnis", "Time1: "+StrF(Time1/#Size1*1000)+"µs"+Chr(10)+"Time2: "+StrF(Time2/#Size2*1000)+"µs")
Bei mir dauert dein PBSCallProcedure() ca. 5000 mal länger als der PB-Weg (ohne Debugger), und eigentlich sollte der ByteCode doch auch "nur" Funktionen aufrufen wie Add(a,b) oder so.
Ich habe halt das Gefühl, dass im ByteCode immer noch "Fragen" gestellt werden, die eigentlich der Compiler stellen müsste, sodass der ByteCode wirklich nur noch aus einem Abarbeiten von Funktionen besteht, wenn du verstehts was ich damit meine.

Ansonsten :allright:
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten