2

C ライブラリに接続していますが、 type のコールバック引数を持つ関数があります(int (*fun) (void *))

これをどのように処理しc2hsますか? https://github.com/haskell/c2hs/wiki/Implementation-of-Haskell-Binding-Modulesまたはhttp://www.cse.unsw.edu.au/~chak/papersで言及されているコールバックが表示されません /Cha99b.html .

私の実際のアプリケーションでは、コールバックは計算を行いません。その間に何らかのフラグが設定されているかどうかを確認する必要があるだけで、Haskell スレッドから設定したいと考えています。(したがって、明らかな回避策は、コールバックとフラグを C ランドで宣言し、Haskell 関数でフラグを設定するだけです。)

(編集) https://wiki.haskell.org/Calling_Haskell_from_Cもチェックしましたが、「ghc -c ... は Safe_stub.c ... を作成します」という理由で拒否しました。しかし実際には、stub.h (必要ですか?) とオブジェクト ファイルを取得します。

4

1 に答える 1

2

c2hs がこれを特別にサポートしているかどうかはわかりませんが、「外国からの輸入「ラッパー」」が必要なようです。ここの Haskell 2010 レポートの「動的ラッパー」の下を参照してください。

具体的には、

foreign import ccall "c_name" c_function_that_takes_a_callback ::
    FunPtr (Ptr Foo -> IO Int) -> IO () -- or whatever the whole type is

その後、あなたがしたい

foreign import ccall "wrapper" makeFooWrapper ::
    (Ptr Foo -> IO Int) -> IO (FunPtr (PtrFoo -> IO Int))

次に、Haskell でコールバックを関数として実装Ptr Foo -> IO IntmakeFooWrapper、それを に渡し、結果を に渡しc_function_that_takes_a_callbackます。

于 2015-02-20T05:02:03.190 に答える