Da wäre jetzt (reine Fleissarbeit ^^) folgendes Modul im Angebot, wobei man in der Main.pb halt nicht nur der Variablen eine Prozedureadresse zuweist,
sondern halt die Procedure noch einmal mit Paramater Zählung "registriert".
Kann man mit Sicherheit verfeinern... unter Umständen Nic's Beispiel um zu testen ob es überhaupt eine Prozedur ist....
Oder wenn man die maximale Anzahl der Parameter eingrenzen kann (z.B. keine Prozedur hat mehr als 7 Parameter)
kann man natürlich die Select Case Geschichte kürzen...
Code: Alles auswählen
; Main
DeclareModule cm_FunctionCall
EnableExplicit
Declare RegisterFunction(*Function, ParamCount = 0)
Declare myCallFunctionFast(*Function, Arg1 = 0, Arg2 = 0, Arg3 = 0, Arg4 = 0, Arg5 = 0, Arg6 = 0, Arg7 = 0, Arg8 = 0, Arg9 = 0, Arg10 = 0, Arg11 = 0, Arg12 = 0, Arg13 = 0, Arg14 = 0, Arg15 = 0, Arg16 = 0, Arg17 = 0, Arg18 = 0, Arg19 = 0)
EndDeclareModule
Module cm FunctionCall
Global NewMap LOP.i()
Procedure RegisterFunction(*Function, ParamCount = 0)
If ParamCount > 19
ProcedureReturn #False
EndIf
If *Function
LOP(Str(*Function)) = ParamCount
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure myCallFunctionFast(*Function, Arg1 = 0, Arg2 = 0, Arg3 = 0, Arg4 = 0, Arg5 = 0, Arg6 = 0, Arg7 = 0, Arg8 = 0, Arg9 = 0, Arg10 = 0, Arg11 = 0, Arg12 = 0, Arg13 = 0, Arg14 = 0, Arg15 = 0, Arg16 = 0, Arg17 = 0, Arg18 = 0, Arg19 = 0)
Protected PC, Result = #False
If FindMapElement(LOP(), Str(*Function))
PC = LOP(Str(*Function))
Select PC
Case 0
Result = CallFunctionFast(*Function)
Case 1
Result = CallFunctionFast(*Function, Arg1)
Case 2
Result = CallFunctionFast(*Function, Arg1, Arg2)
Case 3
Result = CallFunctionFast(*Function, Arg1, Arg2, Arg3)
Case 4
Result = CallFunctionFast(*Function, Arg1, Arg2, Arg3, Arg4)
Case 5
Result = CallFunctionFast(*Function, Arg1, Arg2, Arg3, Arg4, Arg5)
Case 6
Result = CallFunctionFast(*Function, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6)
Case 7
Result = CallFunctionFast(*Function, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7)
Case 8
Result = CallFunctionFast(*Function, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8)
Case 9
Result = CallFunctionFast(*Function, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9)
Case 10
Result = CallFunctionFast(*Function, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9, Arg10)
Case 11
Result = CallFunctionFast(*Function, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9, Arg10, Arg11)
Case 12
Result = CallFunctionFast(*Function, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9, Arg10, Arg11, Arg12)
Case 13
Result = CallFunctionFast(*Function, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9, Arg10, Arg11, Arg12, Arg13)
Case 14
Result = CallFunctionFast(*Function, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9, Arg10, Arg11, Arg12, Arg13, Arg14)
Case 15
Result = CallFunctionFast(*Function, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9, Arg10, Arg11, Arg12, Arg13, Arg14, Arg15)
Case 16
Result = CallFunctionFast(*Function, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9, Arg10, Arg11, Arg12, Arg13, Arg14, Arg15, Arg16)
Case 17
Result = CallFunctionFast(*Function, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9, Arg10, Arg11, Arg12, Arg13, Arg14, Arg15, Arg16, Arg17)
Case 18
Result = CallFunctionFast(*Function, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9, Arg10, Arg11, Arg12, Arg13, Arg14, Arg15, Arg16, Arg17, Arg18)
Case 19
Result = CallFunctionFast(*Function, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9, Arg10, Arg11, Arg12, Arg13, Arg14, Arg15, Arg16, Arg17, Arg18, Arg19)
EndSelect
EndIf
EndProcedure
EndModule
UseModule cm_FunctionCall
Procedure myCallback()
Debug "Piep!"
EndProcedure
RegisterFunction(@myCallback())
MachMalPiep = @myCallback()
SeiFleissig()
; --- Include
Procedure SeiFleissig()
... TuDies()
... myCallFunctionFast(MachMalPiep)
... TuDas()
EndProcedure