4

のffiについていくつか質問がありhaskellます。

まず第一に、私はでc構造体を操作しようとしていhaskellます。

そこにいくつか質問があります:私は次のような構造体を持っています

struct foo{int a; float b;};
  1. いつ使用できますかdata Foo = Foo { a :: Int, b :: Float } deriving (Show, Eq)
  2. ピークアンドポークでストレージを実装する必要がある場合はどうなりますか?

さてさてについての質問FunPtr

  • FunPtrのような通常の定義では不十分な理由をいつ使用するかわかりPtr CInt -> IO CIntませんか?
4

1 に答える 1

9

マーシャリング

構造をマーシャリングするには、クラスインスタンスを使用して、およびを介してデータをマーシャリングする必要がありますStorablepeekpoke

例については、この前の回答を参照してください。hsc2hsを使用して定数、関数、およびデータ構造にバインドする方法は?


FunPtr

FunPtrこれは、外部関数を呼び出すためではなく、FFI境界を越えてファーストクラスの値として関数を渡したい場合にのみ必要です。正確に:

FunPtr a型の値は、外部コードから呼び出し可能な関数へのポインターです。タイプaは通常、外部タイプ、0個以上の引数を持つ関数型になります

例として、コールバック関数を登録します。

foreign import ccall "stdlib.h &free"
   p_free :: FunPtr (Ptr a -> IO ())

Haskell関数に自分自身を渡す必要があるのでp_free、これが実際にはC関数であることをHaskellに知らせなければなりません。FunPtrラッパーがそれを制御します。

于 2011-06-05T15:48:10.427 に答える