2012-02-27 16 views
7

Ho una funzione che restituisce vector<MyClass>; qual è il modo migliore per cambiare questo in qualcosa che è appropriato all'FFI?FFI Haskell: come si fa a racchiudere le raccolte C++?

Sto pensando che un tipo come :: [CIntPointer] potrebbe essere un buon compromesso, se possibile da ottenere.

+0

Avete bisogno di modificare i singoli elementi sul lato Haskell? –

+0

@JohnL, no, chiama semplicemente le funzioni con esse, ad es. 'do {a <- cpp_getVector(); forM a cpp_f} 'where' cpp_f :: ElementType -> IO() ' – gatoatigrado

risposta

3

È possibile definire le proprie funzioni C per allocare, liberare, inserire, rimuovere, ecc. Queste funzioni possono racchiudere il contenitore C++ a cui si desidera accedere. Per esempio:

extern "C" { 

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

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

poi dichiarare in FFI e avvolgerli in qualsiasi modo si desidera.

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()) 

alcuni grattacapi:

  1. Assicurati di compilare i file C con un compilatore C++ (g ++ al posto di gcc). questo assicurerà che le librerie stdC++ vengano rilevate correttamente.
  2. Far passare le posizioni delle librerie (-L) e librerie (-lboost *) per collegare in quando si compila il programma/lib sul lato Haskell
+0

Sì, è più o meno quello che sto facendo ... grazie però. – gatoatigrado

Problemi correlati