Main sections
PROTOTYPE
PROTOTYPE proto: arg1%$ arg2%$ ...
Das Thema ist sehr komplex und für Anfänger nicht zu empfehlen.
Mit PROTOTYPE definiert man einen Funktions-Typ, ohne die Funktion wirklich zu definieren. Dadurch ist es möglich Zeiger auf eine Funktion als Variable zu speichern.
LOCAL ftpptr AS proto
Später kann man dann die Variable zuweisen und somit eine bestehende Funktion aufrufen:
ftpptr = test
ftpptr(1,2)
FUNCTION test: a,b
ENDFUNCTION
Die Funktionszeiger dürfen auch Mitglieder in einem TYPE sein:
TYPE TT
ptr AS proto
ENDTYPE
Um abzufragen ob eine Funktion zugewiesen ist, kann man IF benutzen:
LOCAL foo AS proto
IF foo = FALSE THEN STDOUT "Keine Funktion\n"
foo = test
IF foo THEN STDOUT "Jetzt mit Funktion\n"
Ruft man einen nicht zugewiesene Funktionszeiger auf, stoppt das Programm mit einer Fehlermeldung.
Beispiel:
PROTOTYPE func_proto: a
TYPE Tfoo
moo AS func_proto
ENDTYPE
LOCAL pFoo AS func_proto
IF pFoo=FALSE THEN STDOUT "has no pointer\n"
pFoo = f1
pFoo(1)
pFoo = f2
pFoo(2)
call(pFoo)
LOCAL tp AS Tfoo
tp.moo = f1
tp.moo(4)
ALIAS fkt AS tp.moo
fkt(5)
KEYWAIT
FUNCTION f1: one
STDOUT "f1: "+one+"\n"
ENDFUNCTION
FUNCTION f2: a
STDOUT "f2: "+a+"\n"
ENDFUNCTION
FUNCTION call: foo AS func_proto
foo(3)
ENDFUNCTION