5

abc署名が次の C 関数にバインドしたいと思います。

int abc(void (*)(int))

つまり、関数へのポインタを受け入れます。このコールバックは を受け入れ、戻り値の型intを持ちます。void

ラケットの正しい呪文は何ですか?

4

1 に答える 1

8

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

于 2013-06-08T02:25:02.457 に答える