7

を返す関数がありますvector<MyClass>。これをFFIに適したものに変更する最良の方法は何ですか?

:: [CIntPointer]可能であれば、次のようなタイプが良い妥協案になるかもしれないと考えています。

4

1 に答える 1

3

独自の C 関数を定義して、割り当て、解放、挿入、削除などを行うことができます。これらの関数は、アクセスする C++ コンテナーをラップできます。例えば:

extern "C" {

Obj * obj_create()
{
  return new Obj();
}

void obj_destroy(Obj * schema)
{
  delete obj;
  obj = NULL;
}
...
...
}

次に、それらを FFI で宣言し、好きな方法でラップします。

data SomeObject

type Obj = Ptr SomeObject

foreign import ccall unsafe "obj_create"
    createObj :: IO Obj

foreign import ccall unsafe "obj_destroy"
    destroyObj_ :: Obj -> IO ()

foreign import ccall unsafe "&obj_destroy"
    destroyObj :: FunPtr (Obj -> IO ())

いくつかの落とし穴:

  1. C ファイルは C++ コンパイラ (gcc ではなく g++) でコンパイルしてください。これにより、stdc++ ライブラリが正しく取得されるようになります。
  2. haskell 側でプログラム/lib をコンパイルするときに、ライブラリの場所 (-L) と libs(-lboost*) をリンクに渡します。
于 2012-04-24T20:57:13.267 に答える