2012-06-05 14 views
10

Por supuesto, la respuesta es pasar/tomar un bloque contiguo de memoria de alguna manera, por lo que la pregunta es más acerca de cómo hacerlo. Por ahora, aún podría evitar el problema escribiendo funciones de envoltura en el lado C, pero eso no es una gran solución permanente.Haskell FFI - ¿Cómo manejar las funciones C que aceptan o devuelven structs en lugar de punteros a las estructuras?

+0

¿Está buscando algo como [esto] (http://www.haskell.org/haskellwiki/FFICookBook#Working_with_structs). –

+0

Solo para confirmar: ¿desea pasar la estructura por valor, no por referencia? –

+0

@ Don sí, eso es correcto. – Cubic

Respuesta

12

El FFI no admite el paso arbitrario por el valor de los tipos almacenables Haskell.

Sólo puede pasar valores de tipo (y algunos de ellos son punteros):

Int#, Word#, 
Char#, 
Float#, Double#, 
Addr#, 
StablePtr# a, MutableByteArray#, ForeignObj#, and ByteArray#. 

lo tanto, para pasar a una estructura que debe envolver la llamada a través de un envoltorio de C; que toma un puntero y pasa su valor a la función C que realmente desea llamar.

Una extensión GHC reciente permite importaciones "primop", que eluden el mecanismo FFI y admiten convenciones de llamadas arbitrarias y estructuras de paso a través de tuplas sin caja. P.ej.

foreign import prim "ITCHv41_run" 
    parseITCHv41# :: Addr# -> Word# 
       -> (# Int#, Word#, Word#, Word#, Word#, Word# #) 

Puede usarlos para hacer tricky low level stuff de esta manera.

+3

Gracias por vincular ese blog, tiene muchas cosas realmente útiles. – Crashworks

Cuestiones relacionadas