2012-02-27 13 views
7

Tengo una función que devuelve vector<MyClass>; ¿Cuál es la mejor manera de cambiar esto en algo apropiado para FFI?Haskell FFI: ¿Cómo envuelve las colecciones de C++?

Estoy pensando que un tipo como :: [CIntPointer] podría ser un buen compromiso, si es posible de obtener.

+0

¿Es necesario modificar los elementos individuales en el lado Haskell? –

+0

@JohnL, no, simplemente llame a las funciones con ellos, p. Ej. 'do {a <- cpp_getVector(); forM a cpp_f} 'donde' cpp_f :: ElementType -> IO() ' – gatoatigrado

Respuesta

3

Puede definir sus propias funciones C para asignar, liberar, insertar, eliminar, etc. Estas funciones pueden envolver el contenedor C++ al que desea acceder. Por ejemplo:

extern "C" { 

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

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

luego declararlos en el FFI y los envuelven cualquier manera que usted desea.

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

también algunas precauciones:

  1. Asegúrese de que compila los archivos de C con un compilador de C++ (g ++ en vez de gcc). esto asegurará que las librerías stdC++ sean recogidas correctamente.
  2. pasar los lugares de la biblioteca (-L) y libs (-lboost *) para enlazar en al compilar el programa/lib en el lado Haskell
+0

Sí, eso es más o menos lo que estoy haciendo ... gracias. – gatoatigrado

Cuestiones relacionadas