FreeBASIC FunctionPtr
値を返す FUNCTION 手続き へのポインタを格納するデータ型
構文:
パラメータ:
parameter_list: parameter[, parameter[, ...]]
parameter:
[ByRef|ByVal] identifier [As type] [= default_value]
identifier: 関数で参照される変数の名前
type: 変数の型
default_value: 呼び出しで何も指定されていない場合の引数の値
return_value: 関数から返された値
intializer: 初期値として設定する関数のアドレス
記述:
Function ポインタは、値を返すコンパイル済みコードのメモリ位置を格納する手続きポインタです。 初期化子が与えられていない場合、デフォルトの初期値はゼロ(0)です。
Function 手続きのメモリ・アドレスは、
ProcPtr または
Operator @ (Address of) を持つ関数のアドレスを取得することで、変数に割り当てることができます。
手続きは、宣言された
Function ポインタに、同じ
Function 宣言で、一致しなければなりません。
割り当てられた関数を呼び出すには、通常の宣言された
Function のように
変数 名を使います。
パラメーターリストを空でも常に括弧で囲みます(括弧がない場合は、ポインター値、つまり関数のアドレスのみがアクセスされます)。
Function ポインタの主な用途の 1つは、コールバック手続きを作成することです:
-
コールバック
Function とは、引数(
Function ポインタ)を介して他の手続きに渡され、都合の良いときに「引数」をコールバック(実行)することが期待される
Function のことです。
-
コールバック
Function が完全に実行されてから、呼び出しが、呼び出し元のコードに戻る場合は、コールバック処理は「同期」と呼ばれます。
-
呼び出しが、すぐに呼び出し元のコードに戻り、コールバック
Function と呼び出し元の次のコードが並行して実行されている場合、コールバック処理は「非同期」であると言われます。
例:
Function ConcatSelf( x As String ) As String
Return x & x
End Function
Dim x As Function( x As String ) As String = ProcPtr( ConcatSelf )
Print x( "Hello" )
Function x2 (ByVal i As Integer) As Integer
Return i * 2
End Function
Function x3 (ByVal i As Integer) As Integer
Return i * 3
End Function
Function operation (ByVal i As Integer, ByVal op As Function (ByVal As Integer) As Integer) As Integer
Return op(i)
End Function
Print operation(4, @x2)
Print operation(4, @x3)
'
キー押下イベントを実装するための、基本的なコールバック関数メカニズムの例:
' (
イベント・スレッドの実行中は、ユーザー・コールバック関数のアドレスを変更できません)
' -
非同期スレッドはループ内でキーボードをテストし、キーが押されるたびに、ユーザー・コールバック関数を呼び出します。
' -
コールバック関数のアドレスが、スレッドに渡されます。
' -
コールバック関数は、押されたキーの文字を出力しますが、
'
押されたキーが <escape> の場合は、関数の戻り値を使ってスレッドに終了を指示します。
' -
ユーザーコールバックアドレスは、引数としてスレッドに渡されるため、スレッドの実行中に変更することはできません。
'' スレッドSub定義
Sub threadInkey (ByVal p As Any Ptr)
If p > 0 Then ''
テスト条件コールバック関数定義
Dim As Function (ByRef As String) As Integer callback = p ''
any ptr をコールバック関数ポインタに変換する
Do
Dim As String s = Inkey
If s <> "" Then '' test condition key pressed
If callback(s) Then '' test condition to finish thread
Exit Do
End If
End If
Sleep 50, 1
Loop
End If
End Sub
'' user callback Function definition
Function printInkey (ByRef s As String) As Integer
If Asc(s) = 27 Then '' test condition key pressed = <escape>
Print
Return -1 '' order thread to finish
Else
Print s;
Return 0 '' order thread to continue
End If
End Function
'' user main code
Dim As Any Ptr p = ThreadCreate(@threadInkey, @printInkey) ''
コールバック関数のアドレスを渡して、スレッドを起動します。
ThreadWait(p) ''
スレッドの終了を待つ
QBからの違い:
参照:
ページ歴史:2021-08-03 15:20:24
日本語翻訳:WATANABE Makoto、原文著作者:JeffMarshall