Quando avrete utilizzato puntatori alle funzioni per un certo tempo sarà chiaro che a volte il loro utilizzo è necessario, altre volte no. Penso che ogni situazione sia diversa, ma considerate questa: SELECT CASE I
CASE 1
Process1("1", 44)
CASE 2
Process2("2", 55)
CASE 3
Process3("3", 66)
CASE 4
:
:
etc...
Potete generalizzare questa situazione, ad esempio un menù con diverse opzioni, o un programma di analisi (Rapid-Q utilizza puntatori alle funzioni per analizzare il vostro codice). Come avrete notato, ci sono diverse comparazioni, soprattutto se state scrivendo un analizzatore con molte parole chiave (più di 50). È possibile eliminare facilmente queste comparazioni utilizzando puntatori di funzione, accelerando così il vostro programma. Per un esempio concreto vedi FUNCPTR.BAS. BIND FPtr(1) AS Process1
BIND FPtr(2) AS Process2
BIND FPtr(3) AS Process3
BIND FPtr(4) AS Process4
BIND FPtr(5) AS Process5
BIND FPtr(6) AS Process6
BIND FPtr(7) AS Process7
x = VAL(INPUT$(1))
CALLFUNC(FPtr(x), 33)
Il codice che vedete non è eseguibile così com'è, ma penso che renda l'idea. In nessun caso avremo bisogno di dichiarazioni di questo tipo (purché abbiate partizionato i vostri puntatori correttamente).
11.4 Cosa non supporta Rapid-Q
I puntatori alle funzioni come argomenti non sono supportati. Anche se può sembrare ridicolo, in realtà è una cosa molto utile. Sfortunatamente non ho ancora avuto l'opportunità di implementarlo. È possibile passare il valore del puntatore come argomento, ma come vedete non potrete chiamare la vostra funzione. L'unico modo sarebbe definire un puntatore ad una funzione globale come schema, e successivamente assegnarlo al vostro argomento. Sono più chiaro con un esempio: DECLARE FUNCTION MyFuncTemp (X AS LONG) AS LONG
DECLARE FUNCTION Func1 (X AS LONG) AS LONG
DECLARE FUNCTION Func2 (X AS LONG) AS LONG
DIM Template AS INTEGER
DIM I(100) AS INTEGER
BIND Template TO MyFuncTemp
BIND I(1) TO Func1
BIND I(2) TO Func2
SUB Test (FPtr AS INTEGER)
Template = FPtr
PRINT CALLFUNC(Template, 10)
END SUB
Test I(1)
Questo è l'unico modo per superare questa limitazione.