Seite 1 von 2
String auflösen
Verfasst: 12.03.2013 20:26
von Skiller
hi experts,
habe diesmal wirklch lange gewühlt und ist mit Sicherheit auch supersimpel, aber wie kann ich einen String auflösen, um ihn als Procedure auszuführen.
Code: Alles auswählen
Procedure Func_1()
Debug "Das ist Function 01"
EndProcedure
Macro _Macro(Multi_Funcs)
Multi_Funcs
EndMacro
_Macro("Func_"+STR(1)+"()")
DANKE!!!
Re: String auflösen
Verfasst: 12.03.2013 20:34
von edel
Als String leider gar nicht, zumindest nicht ohne Umwege.
Code: Alles auswählen
Procedure Func_1()
Debug "Das ist Function 01"
EndProcedure
Macro _Macro(num)
Func_#num
EndMacro
_Macro(1)()
Re: String auflösen
Verfasst: 12.03.2013 20:37
von TroaX
Mit Makro geht es leider nicht, da das Makro den Code 1zu1 übernimmt. Es wird also folgendes draus:
Mir fällt im Grunde nur eine CallDynamicFunktion mit Select-Case ein als Wrapper ein.
Re: String auflösen
Verfasst: 12.03.2013 20:43
von cxAlex
Mit Maps & Prototypes und einem Macro zur schöneren Schreibweise kein Problem:
Code: Alles auswählen
EnableExplicit
Prototype __Func()
Structure ___Func_Dummy
*__caller.__Func
EndStructure
Global NewMap __Func.___Func_Dummy()
Macro RegisterFunc(_Name, FunctionPointer)
__Func(_Name)\__caller = FunctionPointer
EndMacro
Macro Func(_n)
__Func(_n)\__caller
EndMacro
; Test ...
Procedure Func1()
Debug "Das ist Funktion 1"
EndProcedure
Procedure Func2()
Debug "Das ist Funktion 2"
EndProcedure
RegisterFunc("1", @Func1())
RegisterFunc("2", @Func2())
Func("1")()
Func("2")()
Gruß, Alex
Re: String auflösen
Verfasst: 12.03.2013 20:47
von TroaX
Neee wie geil Danke. Genau das brauche ich auch. Supi!
Auf die Idee wäre ich nie gekommen. LOL

Re: String auflösen
Verfasst: 12.03.2013 21:06
von cxAlex
Auch wenn das jetzt vielleicht übertrieben ist, damit kann man natürlich nur Proceduren mit genau dieser Signatur (keine Parameter) aufrufen. Hier ein kleiner Code mit dem man verschiedene solcher "Funktionspools" mit definierbaren Parametern anlegen kann, die Handhabung sollte klar sein (hoffe ich):
Code: Alles auswählen
EnableExplicit
CompilerIf Not Defined(__macrobuilder, #PB_Constant)
#__macrobuilder = #True
Macro _Macro1
M
EndMacro
Macro _Macro2
acro
EndMacro
Macro _Macro
: _Macro1#_Macro2
EndMacro
Macro _EndOfMacro1
EndM
EndMacro
Macro _EndOfMacro
: _EndOfMacro1#_Macro2
EndMacro
CompilerEndIf
Macro NewFunctionPool(__PoolName, __Proto)
Prototype __pro_#__PoolName#__Proto
Structure ___Func_#__PoolName#_Dummy
*__caller.__pro_#__PoolName
EndStructure
Global NewMap __Func_#__PoolName.___Func_#__PoolName#_Dummy()
_Macro Register#__PoolName(_n, FunctionPointer)
__Func_#__PoolName#(_n)\__caller = FunctionPointer#_EndOfMacro
_Macro __PoolName#(_n)
__Func_#__PoolName(_n)\__caller#_EndOfMacro
EndMacro
; Test ...
NewFunctionPool(Func, ())
NewFunctionPool(ExFunc, (String$, Number.l))
Procedure Func1()
Debug "Das ist Funktion 1"
EndProcedure
Procedure Func2()
Debug "Das ist Funktion 2"
EndProcedure
RegisterFunc("1", @Func1())
RegisterFunc("2", @Func2())
Func("1")()
Func("2")()
Procedure ExtendedFunc(Name$, Alter.l)
Debug "Name: " + Name$ + " Alter: " + Str(Alter)
EndProcedure
RegisterExFunc("Ausgabe", @ExtendedFunc())
ExFunc("Ausgabe")("Herbert", 48)
Gruß, Alex
Re: String auflösen
Verfasst: 12.03.2013 21:20
von TroaX
Perfekt Danke! Hatte zwar die Frage nicht gestellt. Aber genial ist es trotzdem
EINFALL: Man könnte natürlich auch alle seine Funktionen in eine DLL auslagern und die Funktionen mit CallFunction("NAME_DER_FUNKTION", PARAMETER) aufrufen. Das würde noch schneller gehen

Re: String auflösen
Verfasst: 12.03.2013 21:30
von cxAlex
TroaX hat geschrieben:
EINFALL: Man könnte natürlich auch alle seine Funktionen in eine DLL auslagern und die Funktionen mit CallFunction("NAME_DER_FUNKTION", PARAMETER) aufrufen. Das würde noch schneller gehen

Nein, CallFunction() würde die Funktion "NAME_DER_FUNKTION" jedesmal in der Export - Tabelle der DLL auflösen, wobei man sowieso bei DLLs bevorzugt mit GetFunction() und Prototypes arbeiten sollte. Also hierbei mit RegisterFunc("blabla", GetFunction(hDLL, "NAME_DER_FUNKTION")), sollte schneller sein als jedesmal die Export - Table absuchen zu lassen.
Gruß, Alex
Re: String auflösen
Verfasst: 12.03.2013 21:38
von TroaX
Stimmt. Mit den Funktions-Pointern geht es schneller mit einer DLL. So muss jede Funktion nur einmal gesucht werden.
Re: String auflösen
Verfasst: 13.03.2013 10:28
von Skiller
Das es nun soooo einfach ist....

trotzdem Superr, Danke !!!!
-----------------------------------------------------------------------------
Jetzt noch mal was Anderes:
reagiert ab der 4.51 nicht... zumindest bei mir.
Könnt Ihr das mal checken? Gruß Skiller