FreeBASIC マニュアルのトップに戻る

FreeBASIC FunctionPtr

目次→言語リファレンス→変数とデータ型→標準のデータ型FUNCTION Pointer←オリジナル・サイト

FUNCTION Pointer(関数) 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る

値を返す FUNCTION 手続き へのポインタを格納するデータ型

構文:
dim variable as Function [CDecl|Pascal|StdCall] [( [parameter_list] )] [ ByRef ] [As return_type] [= initializer]

パラメータ:
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

ホームページのトップに戻る

表示-非営利-継承