Für allgemeine Fragen zur Programmierung mit PureBasic.
Skiller
Beiträge: 151 Registriert: 04.02.2005 22:26
Beitrag
von Skiller » 12.03.2013 20:26
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!!!
edel
Beiträge: 3667 Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:
Beitrag
von edel » 12.03.2013 20:34
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)()
TroaX
Beiträge: 722 Registriert: 08.03.2013 14:27
Computerausstattung: PC: Stromschlucker 2000 | Lappi: Nerventot 3000 | Mini-PC: Nichts_halbes_oder_ganzes 4000
Wohnort: NRW
Kontaktdaten:
Beitrag
von TroaX » 12.03.2013 20:37
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.
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: N150 Mini-PC | 16 GB RAM | Debian 13+CasaOS
Coding: Purebasic, Spiderbasic
Blog: https://techtroax.de
Repos: https://codeberg.org/TroaX
cxAlex
Beiträge: 2111 Registriert: 26.06.2008 10:42
Beitrag
von cxAlex » 12.03.2013 20:43
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
Zuletzt geändert von
cxAlex am 12.03.2013 20:48, insgesamt 1-mal geändert.
TroaX
Beiträge: 722 Registriert: 08.03.2013 14:27
Computerausstattung: PC: Stromschlucker 2000 | Lappi: Nerventot 3000 | Mini-PC: Nichts_halbes_oder_ganzes 4000
Wohnort: NRW
Kontaktdaten:
Beitrag
von TroaX » 12.03.2013 20:47
Neee wie geil Danke. Genau das brauche ich auch. Supi!
Auf die Idee wäre ich nie gekommen. LOL
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: N150 Mini-PC | 16 GB RAM | Debian 13+CasaOS
Coding: Purebasic, Spiderbasic
Blog: https://techtroax.de
Repos: https://codeberg.org/TroaX
cxAlex
Beiträge: 2111 Registriert: 26.06.2008 10:42
Beitrag
von cxAlex » 12.03.2013 21:06
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
TroaX
Beiträge: 722 Registriert: 08.03.2013 14:27
Computerausstattung: PC: Stromschlucker 2000 | Lappi: Nerventot 3000 | Mini-PC: Nichts_halbes_oder_ganzes 4000
Wohnort: NRW
Kontaktdaten:
Beitrag
von TroaX » 12.03.2013 21:20
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
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: N150 Mini-PC | 16 GB RAM | Debian 13+CasaOS
Coding: Purebasic, Spiderbasic
Blog: https://techtroax.de
Repos: https://codeberg.org/TroaX
cxAlex
Beiträge: 2111 Registriert: 26.06.2008 10:42
Beitrag
von cxAlex » 12.03.2013 21:30
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
TroaX
Beiträge: 722 Registriert: 08.03.2013 14:27
Computerausstattung: PC: Stromschlucker 2000 | Lappi: Nerventot 3000 | Mini-PC: Nichts_halbes_oder_ganzes 4000
Wohnort: NRW
Kontaktdaten:
Beitrag
von TroaX » 12.03.2013 21:38
Stimmt. Mit den Funktions-Pointern geht es schneller mit einer DLL. So muss jede Funktion nur einmal gesucht werden.
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: N150 Mini-PC | 16 GB RAM | Debian 13+CasaOS
Coding: Purebasic, Spiderbasic
Blog: https://techtroax.de
Repos: https://codeberg.org/TroaX
Skiller
Beiträge: 151 Registriert: 04.02.2005 22:26
Beitrag
von Skiller » 13.03.2013 10:28
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