abc
署名が次の C 関数にバインドしたいと思います。
int abc(void (*)(int))
つまり、関数へのポインタを受け入れます。このコールバックは を受け入れ、戻り値の型int
を持ちます。void
ラケットの正しい呪文は何ですか?
callTwice
同様のバインドの例を次に示します。署名付きの関数をバインドしたいとしましょう:
int callTwice(int (*)(int));
そして愚かなCの実装で:
int callTwice(int (*f)(int)) {
return f(f(42));
}
Racket FFI バインディングは次のようになります。
(define call-twice (get-ffi-obj "callTwice" the-lib
(_fun (_fun _int -> _int) -> _int)))
the-lib
から取得した FFI バインド ライブラリはどこにありますかffi-lib
。ここで、 の最初の引数call-twice
自体が a(_fun _int -> _int)
であることがわかります。これは、この例で必要な関数ポインター型です。
つまり、技術的には次のように書くこともできます。
(define _mycallback (_fun _int -> _int))
(define call-twice (get-ffi-obj "callTwice" the-lib
(_fun _mycallback -> _int)))
call-twice
唯一の引数としてコールバックを受け取ることを簡単に確認できるようにします。(_fun _int -> _void)
あなたのケースでは、コールバック タイプの値が必要になるでしょう。
完全に完成した例は、https ://github.com/dyoo/ffi-tutorial/tree/master/ffi/tutorial/examples/call-twice にあります。そのディレクトリで を実行しpre-installer.rkt
て拡張機能をビルドし、 を実行してテストしますtest-call-twice.rkt
。