Pointers that point to procedures
Just as pointers can be made to point to an
Integer or
Single type, pointers can also point to procedures, that is, they can store the address of a procedure.
Declaration
To declare a pointer to procedure, use the
Sub or
Function keywords, followed by any parameters and return value type:
' declares a pointer to sub procedure that takes no arguments
Dim pointerToProcedure As Sub
Procedure pointers store procedure addresses, which are retrieved using
Operator @ (Address of) or the
Procptr Operator:
Function Add (a As Integer, b As Integer) As Integer
Return a + b
End Function
Dim pFunc As Function (As Integer, As Integer) As Integer = @Add
Calling a procedure pointer
The interesting thing about procedure pointers is that they can be called just like a procedure:
'' .. Add and pFunc as before ..
#include once "pfunc.bi"
Print "3 + 4 = " & pFunc(3, 4)
Passing procedure pointers to procedures
Passing procedure pointers to other procedures is similar as well:
'' .. Add and pFunc as before ..
#include once "pfunc.bi"
Function DoOperation (a As Integer, b As Integer, operation As Function (As Integer, As Integer) As Integer) As Integer
Return operation(a, b)
End Function
Print "3 + 4 = " & DoOperation(3, 4, @Add)
Because procedure pointer declarations can be lengthy, it often helps to create a type alias for the procedure pointer, in an effort to make clearer code:
'' .. Add and pFunc as before ..
#include once "pfunc.bi"
Type operation As Function (As Integer, As Integer) As Integer
Function DoOperation (a As Integer, b As Integer, op As operation) As Integer
Return op(a, b)
End Function
Print "3 + 4 = " & DoOperation(3, 4, @Add)
Pointers to procedure pointers
Because the syntax of a procedure pointer does not allow declaration of a pointer to procedure pointer, a type alias is used. Notice how it is necessary to surround a dereferenced pointer to procedure pointer by parenthesis when calling the procedure. This is because the function-call operator '()' has higher precedence than
Operator * (Value of):
Sub Halve (ByRef i As Integer)
i /= 2
End Sub
Sub Triple (ByRef i As Integer)
i *= 3
End Sub
Type operation As Sub (ByRef As Integer)
' an array of procedure pointers, NULL indicates the
' end of the array
Dim operations(20) As operation = _
{ @Halve, @Triple, 0 }
Dim i As Integer = 280
' apply all of the operations to a variable by iterating through the array
' with a pointer to procedure pointer
Dim op As operation Ptr = @operations(0)
While (0 <> *op)
' call the procedure that is pointed to, note the extra parenthesis
(*op)(i)
op += 1
Wend
Print "Value of 'i' after all operations performed: " & i
See also