Haskellでコールバックを使用するC関数を呼び出す方法は?

アレクセイラガ

使用して次のC関数を呼び出そうとしていますHaskellc2hs

void rd_kafka_conf_set_rebalance_cb (
    rd_kafka_conf_t *conf,
    void (*rebalance_cb) (rd_kafka_t *rk,
                          rd_kafka_resp_err_t err,
                          rd_kafka_topic_partition_list_t *partitions,
                          void *opaque));

私はc2hsバインディングの宣言に精通しておらず、問題を抱えています。

これは私が試したものです:

--callback type
type RebalanceCbFun = 
    Ptr RdKafkaT -> CInt -> Ptr RdKafkaTopicPartitionListT -> Ptr Word8 -> IO ()

foreign import ccall safe "wrapper" 
    mkRebalanceCallback :: RebalanceCbFun -> IO (FunPtr RebalanceCbFun)

foreign import ccall unsafe "rd_kafka.h &rd_kafka_conf_set_rebalance_cb"
    rdKafkaConfSetRebalanceCb :: Ptr RdKafkaConfT -> FunPtr RebalanceCbFun -> IO ()

ただし、このコードのコンパイル中に次のエラーが発生します。

Unacceptable type in foreign declaration:
  ‘Ptr RdKafkaConfT
   -> FunPtr
        (Ptr RdKafkaT
         -> Int32 -> Ptr RdKafkaTopicPartitionListT -> Ptr Word8 -> IO ())
   -> IO ()’ cannot be marshalled in a foreign call
  A foreign-imported address (via &foo) must have type (Ptr a) or (FunPtr a)
When checking declaration:
  foreign import ccall unsafe "static rd_kafka.h &rd_kafka_conf_set_rebalance_cb" rdKafkaConfSetRebalanceCb
    :: Ptr RdKafkaConfT -> FunPtr RebalanceCbFun -> IO ()

どこが欠けているのPtrか、FunPtrここにあるのかわかりませんまた、全体rdKafkaConfSetRebalanceCbを次のFunPtrようにラップしようとしました

foreign import ccall unsafe "rd_kafka.h &rd_kafka_conf_set_rebalance_cb"
    rdKafkaConfSetRebalanceCb :: FunPtr (Ptr RdKafkaConfT -> FunPtr RebalanceCbFun -> IO ())

コンパイルしても意味があるかどうかはわかりません...しかし、この関数の使用方法がわかりません。これが私が試したものです(これは、最終的に必要な署名です)。

kafkaConfSetRebalanceCb :: RdKafkaConfTPtr -> RebalanceCbFun -> IO ()
kafkaConfSetRebalanceCb conf cb = do
    cb' <- mkRebalanceCallback cb
    withForeignPtr conf $ \c -> rdKafkaConfSetRebalanceCb c cb'
    return ()

今では、呼び出す関数がなく、関数へのポインタだけがあると文句を言います(そのFunPtr折り返しのため)。

上記CC署名に対してバインディングを正しく行う方法を教えてください

ダニエル・ワーグナー

次のファイルは私にとってはうまくコンパイルされます(with ghc -c Test.hs)。唯一の本当の違いは、私が&外国からの輸入でを省略したことです。

{-# LANGUAGE ForeignFunctionInterface #-}
module Test where
import Data.Word
import Foreign.C.Types
import Foreign.Ptr
import Foreign.ForeignPtr

newtype RdKafkaT = RdKafkaT (Ptr RdKafkaT)
newtype RdKafkaConfT = RdKafkaConfT (Ptr RdKafkaConfT)
newtype RdKafkaTopicPartitionListT = RdKafkaTopicPartitionListT (Ptr RdKafkaTopicPartitionListT)

type RebalanceCbFun = 
    Ptr RdKafkaT -> CInt -> Ptr RdKafkaTopicPartitionListT -> Ptr Word8 -> IO ()

foreign import ccall safe "wrapper" 
    mkRebalanceCallback :: RebalanceCbFun -> IO (FunPtr RebalanceCbFun)

foreign import ccall unsafe "rd_kafka.h rd_kafka_conf_set_rebalance_cb"
    rdKafkaConfSetRebalanceCb :: Ptr RdKafkaConfT -> FunPtr RebalanceCbFun -> IO ()

kafkaConfSetRebalanceCb :: ForeignPtr RdKafkaConfT -> RebalanceCbFun -> IO ()
kafkaConfSetRebalanceCb conf cb = do
    cb' <- mkRebalanceCallback cb
    withForeignPtr conf $ \c -> rdKafkaConfSetRebalanceCb c cb'

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

C関数によって呼び出されるHaskellコールバック関数でスローされるHaskell例外をキャッチする方法は?

分類Dev

コールバック関数で__doPostBackを呼び出す方法

分類Dev

C#で行うようにJavaでコールバックを使用して関数を呼び出す方法

分類Dev

引数を使用してコールバック関数を呼び出す方法

分類Dev

小道具でコールバック関数を呼び出す

分類Dev

JavaScriptのコールバック内でtypescript関数を呼び出す方法

分類Dev

コールバックとしてCからpython関数を呼び出す。GILを処理する正しい方法は何ですか?

分類Dev

関数を呼び出す前にコールバック関数の引数の数を確認する方法

分類Dev

プロトコル適用を使用して関数で呼び出されるコールバック関数に「this」オブジェクトを渡す方法

分類Dev

ctypesを使用したコールバック(CからPython関数を呼び出す方法)

分類Dev

C ++ Boost関数のコールバック。関数をコールバックとして呼び出し、内部にパラメーターを渡す方法は?

分類Dev

Javaでパラメータとしてコールバックを取る関数を呼び出す方法

分類Dev

2つのコールバックを使用して関数呼び出しをpromiseに変換する方法

分類Dev

コールバック関数が最後に呼び出されるのはなぜですか?関数をテストする方法は?

分類Dev

Typescriptでコールバックを呼び出す方法は?

分類Dev

匿名およびコールバック関数で外部関数を呼び出す方法

分類Dev

formValidationプラグイン内で検証コールバック関数を呼び出す方法は?

分類Dev

子リストでコールバック関数を呼び出さないようにする方法

分類Dev

コールバックを使用する代わりに、別の関数から関数を呼び出さないのはなぜですか?

分類Dev

コールバック関数から関数呼び出しに変数を渡す方法は?

分類Dev

角度2のコールバック関数から親関数を呼び出す方法は?

分類Dev

bxsliderコールバック内の関数を呼び出す

分類Dev

コールバック関数内で継承された関数を呼び出す方法

分類Dev

v8、libuv、nodejs、win32 api-EnumWindowsを呼び出し、コールバックでjavascript関数を呼び出す方法は?

分類Dev

Node.js:コールバックから関数を再度呼び出す方法

分類Dev

コールバックなしでブースト関数を呼び出す

分類Dev

ajax呼び出しpromiseの.done()関数の前にコールバック関数を使用する

分類Dev

Javascriptで関数をグローバルに呼び出すことができるのに、なぜコールバックを使用するのですか?

分類Dev

AngularJSはコールバック関数を呼び出します

Related 関連記事

  1. 1

    C関数によって呼び出されるHaskellコールバック関数でスローされるHaskell例外をキャッチする方法は?

  2. 2

    コールバック関数で__doPostBackを呼び出す方法

  3. 3

    C#で行うようにJavaでコールバックを使用して関数を呼び出す方法

  4. 4

    引数を使用してコールバック関数を呼び出す方法

  5. 5

    小道具でコールバック関数を呼び出す

  6. 6

    JavaScriptのコールバック内でtypescript関数を呼び出す方法

  7. 7

    コールバックとしてCからpython関数を呼び出す。GILを処理する正しい方法は何ですか?

  8. 8

    関数を呼び出す前にコールバック関数の引数の数を確認する方法

  9. 9

    プロトコル適用を使用して関数で呼び出されるコールバック関数に「this」オブジェクトを渡す方法

  10. 10

    ctypesを使用したコールバック(CからPython関数を呼び出す方法)

  11. 11

    C ++ Boost関数のコールバック。関数をコールバックとして呼び出し、内部にパラメーターを渡す方法は?

  12. 12

    Javaでパラメータとしてコールバックを取る関数を呼び出す方法

  13. 13

    2つのコールバックを使用して関数呼び出しをpromiseに変換する方法

  14. 14

    コールバック関数が最後に呼び出されるのはなぜですか?関数をテストする方法は?

  15. 15

    Typescriptでコールバックを呼び出す方法は?

  16. 16

    匿名およびコールバック関数で外部関数を呼び出す方法

  17. 17

    formValidationプラグイン内で検証コールバック関数を呼び出す方法は?

  18. 18

    子リストでコールバック関数を呼び出さないようにする方法

  19. 19

    コールバックを使用する代わりに、別の関数から関数を呼び出さないのはなぜですか?

  20. 20

    コールバック関数から関数呼び出しに変数を渡す方法は?

  21. 21

    角度2のコールバック関数から親関数を呼び出す方法は?

  22. 22

    bxsliderコールバック内の関数を呼び出す

  23. 23

    コールバック関数内で継承された関数を呼び出す方法

  24. 24

    v8、libuv、nodejs、win32 api-EnumWindowsを呼び出し、コールバックでjavascript関数を呼び出す方法は?

  25. 25

    Node.js:コールバックから関数を再度呼び出す方法

  26. 26

    コールバックなしでブースト関数を呼び出す

  27. 27

    ajax呼び出しpromiseの.done()関数の前にコールバック関数を使用する

  28. 28

    Javascriptで関数をグローバルに呼び出すことができるのに、なぜコールバックを使用するのですか?

  29. 29

    AngularJSはコールバック関数を呼び出します

ホットタグ

アーカイブ