2

私はかなりの数のC構造体を次のように構造化しています

typedef struct {
    unsigned int a;
    unsigned int b;
} StructA;

そして、のような多くの機能

void doSomethingWith(StructA*,StructB*,StructC*);

Haskell FFIでこれらの関数を呼び出す簡単な方法はありますか?たとえば、Cの&演算子のように動作するものはありますか?(ないのではないかと思いますが、あったら知りたいです)。Haskell側のインスタンスを格納可能にする必要ありますかdata(これらの構造体のコンストラクター関数はありません)。

また、構造体ポインターの代わりに構造体を渡す必要がある場合(架空の質問ではなく、そのような関数がいくつかあります-それは私のコードではないので、それについては何もできません)、代わりに構造体?電話したい場合のように

void function(StructA);

私はこれを行うことができます

foreign import ccall "function" :: CUInt -> CUInt -> IO()

4

1 に答える 1

4

Haskell データへの参照を C に渡すには、メモリが Haskell ヒープに割り当てられ、C がデータを直接操作する必要があります。

  • メモリ内に正しい形状があることを確認します(StorableA を と同じバイト構造にマップするインスタンスを介してStructA)。
  • mallocForeignPtrを介して、Haskell ヒープに確保されたメモリを割り当てて埋める

このアプローチには、考慮すべきいくつかの結果があります。

  • ForeignPtr へのすべての参照を削除すると、GHC は値の割り当てを解除します。そのため、C 側が再び値に触れないようにする必要があります。
  • CにHaskellヒープ上のものをいじらせているので、それが正しいことを確認してください

その他のオプション:

  • を介して不透明な参照を C に渡します。StablePtr
  • C側でメモリを割り当て、ファイナライザを使用して解放します。
于 2012-06-05T15:59:38.140 に答える