2012-02-27 24 views
7

私はvector<MyClass>を返す関数を持っています。これをFFIに適したものに変更するにはどうすればよいでしょうか?Haskell FFI:C++コレクションをどのようにラップしますか?

私は:: [CIntPointer]のようなタイプは、可能な場合は、良い妥協であるかもしれないと思っています。

+0

上のプログラム/ libがコンパイルするときでリンクするライブラリの場所(-L)とLIBS(-lboost *)を渡し、あなたがHaskellの側の個々の要素を変更する必要がありますか? –

+0

@ JohnL、いいえ、単に関数を呼び出すだけです。 'do {a < - cpp_getVector(); forM a cpp_f} 'cpp_f :: ElementType - > IO()' – gatoatigrado

答えて

3

alloc、free、insert、removeなどの独自の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++コンパイラ(gccの代わりにG ++)でCファイルをコンパイルすることを確認してください。これにより、stdC++ライブラリが正しく選択されるようになります。
  2. Haskellの側
+0

ええ、それは私がやっていることです。 – gatoatigrado

関連する問題