Seite 1 von 1

Adressierungsproblem

Verfasst: 24.09.2010 13:41
von Lowrider39
Ich bin gerade dabei einen Befehlsparser zu bauen. Da ich allerdings nicht für jeden Befehl eine IF .. THEN.. Abfrage starten will (wird zu langsam bei ein paar hundert Befehlen) habe ich mir folgendes Szenario gedacht:

Aus den Befehlen erzeuge ich eine Nummer, die steht in einer Variable Befehl.

Wie kann ich jetzt eine Prozedur anspringen, die den Variableninhalt (von Befehl) als Namen hat?

Kann mir einer von Euch da weiterhelfen? Ich bin da nicht so fit in der Adressierung?!?

Gruß Andreas

Re: Adressierungsproblem

Verfasst: 24.09.2010 14:08
von STARGÅTE
zB so:

Code: Alles auswählen

Prototype.f Operation(Value1.f, Value2.f)

Procedure.f Addition(Value1.f, Value2.f)
  ProcedureReturn Value1 + Value2
EndProcedure

Procedure.f Multiplikation(Value1.f, Value2.f)
  ProcedureReturn Value1 * Value2
EndProcedure


Global NewMap *Operation()
*Operation("addiere") = @Addition()
*Operation("multipliziere") = @Multiplikation()


Procedure.s Rechne(Operation$, Value1$, Value2$)
  Protected Operation.Operation = *Operation(Operation$)
  ProcedureReturn StrF(Operation(ValF(Value1$), ValF(Value2$)))
EndProcedure


Debug Rechne("addiere", "4", "5")
Debug Rechne("multipliziere", "4", "5")
Debug Rechne("multipliziere", Rechne("addiere", "4", "5"), "5")
Du erstellst eine Map mit den Keys als "Funktionsnamen" und deren echten Pointer zur Prozedur in PB.
In der Rechne() -Prozedure, wird dann über den Prototypen die Prozedur angesprochen.

Habs hier gleich mal komplett mit Strings gemacht, wie es beim parsen ja sein würde.

EDIT: Das kannst du natürlich noch schneller machen, wenn du statt einer MAP ein ARRAY nimmst, und wie von dir vorgeschlagen allen Funktionenn Nummern gibst ...

Re: Adressierungsproblem

Verfasst: 24.09.2010 19:15
von Lowrider39
Hat zwar ein bisschen gedauert, funktioniert aber genau so, wie erwartet. Ich steig zwar nicht wirklich durch, was du da machst, aber Funktion ist alles.
Danke dir für die schnelle Hilfe.

Gruß Andreas