String auflösen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Skiller
Beiträge: 151
Registriert: 04.02.2005 22:26

String auflösen

Beitrag 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!!!
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: String auflösen

Beitrag 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)()
Benutzeravatar
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:

Re: String auflösen

Beitrag von TroaX »

Mit Makro geht es leider nicht, da das Makro den Code 1zu1 übernimmt. Es wird also folgendes draus:

Code: Alles auswählen

Macro _Macro(Multi_Funcs)
  "func_l()"
EndMacro
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
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: String auflösen

Beitrag 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
Zuletzt geändert von cxAlex am 12.03.2013 20:48, insgesamt 1-mal geändert.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
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:

Re: String auflösen

Beitrag von TroaX »

Neee wie geil Danke. Genau das brauche ich auch. Supi! :-)

Auf die Idee wäre ich nie gekommen. LOL :-D
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
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: String auflösen

Beitrag 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
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
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:

Re: String auflösen

Beitrag von TroaX »

Perfekt Danke! Hatte zwar die Frage nicht gestellt. Aber genial ist es trotzdem :-D

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
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: String auflösen

Beitrag 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
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
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:

Re: String auflösen

Beitrag von TroaX »

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

Re: String auflösen

Beitrag von Skiller »

Das es nun soooo einfach ist.... :freak: trotzdem Superr, Danke !!!!
-----------------------------------------------------------------------------
Jetzt noch mal was Anderes:

Code: Alles auswählen

#PB_Key_Minus
reagiert ab der 4.51 nicht... zumindest bei mir.
Könnt Ihr das mal checken? Gruß Skiller
Antworten