Variablenoperationen aus Strings erkennen

Für allgemeine Fragen zur Programmierung mit PureBasic.
kaktusbombe
Beiträge: 5
Registriert: 16.07.2009 10:42
Wohnort: Im PC-Zimmer

Variablenoperationen aus Strings erkennen

Beitrag von kaktusbombe »

Hallo, Forum,
Ja ich weiß, der Titel ist nicht sonderlich aussagekräftig, aber mir ist grad nichts besseres eingefallen.
Im Grunde suche ich eine Möglichkeit, wie ein Programm aus einem String erkennt, was es mit einer Variablen machen soll.

Ich glaube, ein Beispiel hift am besten:
Ich habe ein Textfester, in dem ich eingeben kann: "irgendeine_Variable=53"
und das Programm soll nun die Variable "irgendeine_Variable" mit 53 füllen.

War mein Problem soweit verständlich?
Ich habe halt noch recht wenig Erfahrungen mit Stringoperationen und habe deshalb
keine Ahnung, wie ich an besten an das Problem ran komme. Ziel ist es, eine brauchbare Konsole für ein zukünftiges Spiel zu erstellen, an der ich, während das Spiel läuft, irgendwelche Werte anpassen kann.
Ich hoffe, ihr könnt mir dabei helfen...
Benutzeravatar
Pelagio
Beiträge: 424
Registriert: 11.11.2004 17:52
Computerausstattung: AMD Ryzen 5 7600 6-Core Prozessor 3.80 GHz
16,0 GB Arbeitsspeicher
Windows 11 Pro Betriebssystem
Wohnort: Bremen

Re: Variablenoperationen aus Strings erkennen

Beitrag von Pelagio »

Hallo kaktusbombe,

auf die schnelle gebe ich dir einmal ein Codeschnitzel welches dir hoffentlich helfen kann.

Code: Alles auswählen

Variable$="Test1=50"

If FindString(Variable$,"Test1",1)
   Test1$ = StringField(Variable$, 2, "=")
ElseIf FindString(Variable$,"Test2",1)
   Test2$ = StringField(Variable$, 2, "=")
;ElseIf usw.....
EndIf

Debug Test1$
Ohne Zeit kein Fleiß
Auf neustem Stand zu sein ist eine Kunst die nicht jeder perfektioniert [Win11Pro; PB6.20 LTS]. :allright:
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Variablenoperationen aus Strings erkennen

Beitrag von Kiffi »

kaktusbombe hat geschrieben:Ziel ist es, eine brauchbare Konsole für ein zukünftiges Spiel zu erstellen, an der ich, während das Spiel läuft, irgendwelche Werte anpassen kann.
eine andere Möglichkeit ist es, LUA hierfür zu benutzen (ist meines Erachtens genau dafür geschrieben worden). Als Suchbegriff eingegeben, werden hier einige brauchbare Treffer gelistet.

Grüße ... Kiffi
a²+b²=mc²
kaktusbombe
Beiträge: 5
Registriert: 16.07.2009 10:42
Wohnort: Im PC-Zimmer

Re: Variablenoperationen aus Strings erkennen

Beitrag von kaktusbombe »

@Pelagio: Genau das wollte ich verhindern versuchen, das erfordert einen Riesen Select-Baum,
wenn ich auf ALLE Variablen zugreifen können will...

Wenn ich "Lua" suche, kommen bei mir keine Ergebnisse angezeigt...
(bin ich zu blöd zum Suchen?!?)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Variablenoperationen aus Strings erkennen

Beitrag von STARGÅTE »

Dafür sollte eine Map benutzt werden, damit der SelectBaum entfällt:

Code: Alles auswählen

Beispiel$ = "irgendeine_Variable=53:LaberLaber=123"

NewMap Variable()

Index = 1
While StringField(Beispiel$, Index, ":")
  Key$ = Trim(StringField(StringField(Beispiel$, Index, ":"), 1, "="))
  Value$ = Trim(StringField(StringField(Beispiel$, Index, ":"), 2, "="))
  Variable(Key$) = Val(Value$)
  Index + 1
Wend

ForEach Variable()
  Debug MapKey(Variable())+" = "+Str(Variable())
Next
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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Variablenoperationen aus Strings erkennen

Beitrag von Kaeru Gaman »

das erfordert keinen Selectbaum...
im Endeffekt musst du dir sowieso überlegen, wie du wärend des Programmablaufs auf die Variablen zugreifst.

also, wenn die Alle unterschiedlich heißen, wirst du wohl oder übel auch so viele Bedingungen brauchen, weil du für jeden Namen eine extra Zuweisung hinschreiben musst.
aber wenn du alle Werte die veränderbar sein sollen in ein Array packst, kannst du das einfach per Index auslesen.
oder du nimmst gleich eine Map, die Namen als Indices akzeptiert.

[edith]
*möp* Stargate war mal wieder schneller....

@Stargate
da fehlt aber noch die Prüfung, ob das Element existiert und wenn nicht eine Fehlermeldung.
schließlich kann man sich ja in der Console auch vertippen...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Variablenoperationen aus Strings erkennen

Beitrag von Kiffi »

kaktusbombe hat geschrieben:Wenn ich "Lua" suche, kommen bei mir keine Ergebnisse angezeigt...
(bin ich zu blöd zum Suchen?!?)
:freak: nee. Ist nur mal wieder unsere grandiose Suchmaschine. :|

Such mal nach *lua*.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Variablenoperationen aus Strings erkennen

Beitrag von ts-soft »

kaktusbombe hat geschrieben: Wenn ich "Lua" suche, kommen bei mir keine Ergebnisse angezeigt...
(bin ich zu blöd zum Suchen?!?)
Lua lib
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Variablenoperationen aus Strings erkennen

Beitrag von Kiffi »

ts-soft hat geschrieben:Lua lib
oder so ;-)

Eventuell könnte das hier noch interessant sein?

PBScript - Scriptsprache mit PureBasic-Syntax

(habe ich selber noch nicht ausprobiert)

Grüße ... Kiffi
a²+b²=mc²
Kevin
Beiträge: 236
Registriert: 11.06.2007 12:55

Re: Variablenoperationen aus Strings erkennen

Beitrag von Kevin »

hi,

sowas zb:

Code: Alles auswählen

Procedure FindNext(string$, searchpos=1, searchstrings$="|=|+|-|*|/|:|§|")
  re=0
  For z=searchpos To Len(string$)
    re=FindString(searchstrings$,Mid(string$,z,1)+"|",1)
    If re
      re=z
     Break
    EndIf
  Next
ProcedureReturn re
EndProcedure
Procedure.s GetFindNext(string$, searchpos=1, searchstrings$="|=|+|-|*|/|:|§|")
  re=0
  For z=searchpos To Len(string$)
    re$=Mid(string$,z,1)
    re=FindString(searchstrings$,re$+"|",1)
    If re
     Break
    EndIf
  Next
ProcedureReturn re$
EndProcedure

Global S_VarCount.w=1
Global Dim S_Var.s(S_VarCount)
Global Dim S_VarM.i(S_VarCount)
Procedure S_AddPBVar(name$, *var)
  find = 0
  For z=1 To S_VarCount
    If S_Var(z)=""
      S_Var(z)=name$
      S_VarM(z)=*var
      find = 1
     Break
    EndIf
  Next
  If find=0
  S_VarCount+1
  ReDim S_Var.s(S_VarCount)
  ReDim S_VarM.i(S_VarCount)
  S_Var(S_VarCount)=name$
  S_VarM(S_VarCount)=*var
  EndIf
EndProcedure
Procedure S_IsVar(string$)
  re=0
  If string$<>""
    For z=1 To S_VarCount
      buf$=S_Var(z)
      If buf$=string$
        re=z
       Break
      EndIf
    Next
  EndIf
ProcedureReturn re
EndProcedure
Procedure S_RunScript(script$)
  script$+"§"
  find=0
  find$=""
  Repeat
    oldfind=find+1
    oldfind$=find$
    find$=GetFindNext(script$,find+1)
    find=FindNext(script$,find+1)
    oldspace$=space$
    space$=Trim(Mid(script$,oldfind,find-oldfind))
    oldfind=find+1
    oldfind$=find$
    find$=GetFindNext(script$,find+1)
    find=FindNext(script$,find+1)
    oldspace$=space$
    space$=Trim(Mid(script$,oldfind,find-oldfind))

    bufa=S_IsVar(oldspace$)
    bufb=S_IsVar(space$)
    If bufb
      lbufb.l=PeekL(S_VarM(bufb))
     Else
      lbufb.l=Val(space$)
    EndIf

    Select oldfind$
     Case "="
       If bufa
         lbuf.l=PeekL(S_VarM(bufa))
         lbuf=lbufb
         PokeL(S_VarM(bufa),lbuf)
       EndIf
     
     Case "+"
       If bufa
         lbuf.l=PeekL(S_VarM(bufa))
         lbuf+lbufb
         PokeL(S_VarM(bufa),lbuf)
       EndIf

     Case "-"
       If bufa
         lbuf.l=PeekL(S_VarM(bufa))
         lbuf-lbufb
         PokeL(S_VarM(bufa),lbuf)
       EndIf

     Case "*"
       If bufa
         lbuf.l=PeekL(S_VarM(bufa))
         lbuf*lbufb
         PokeL(S_VarM(bufa),lbuf)
       EndIf

     Case "/"
       If bufa
         lbuf.l=PeekL(S_VarM(bufa))
         lbuf/lbufb
         PokeL(S_VarM(bufa),lbuf)
       EndIf
    EndSelect

    If find$="§"
     Break
    EndIf

  Until find=0
EndProcedure


; -----------------------

testvar1.l = 0
testvar2.l = 0

S_AddPBVar("var1", @testvar1)
S_AddPBVar("var2", @testvar2)

Debug testvar1 ; ist 0

S_RunScript(" var1 = 5 ")

Debug testvar1 ; ist 5

testvar2 = 4           ; var2 = 4
buf$ = "  var1 + var2" ; var1 = 9
buf$ + ": var1 / 3"    ; var1 = 3
buf$ + ": var2 = 1"    ; var2 = 1

S_RunScript(buf$)

Debug testvar1; ist 3
Debug testvar2; ist 1
Antworten