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?
Respuesta
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.
Gracias por vincular ese blog, tiene muchas cosas realmente útiles. – Crashworks
- 1. ¿Cómo uso el FFI de Haskell en las estructuras?
- 2. array de N punteros a funciones que devuelven punteros a las funciones
- 3. Pasar punteros/referencias a estructuras en funciones
- 4. C sintaxis para funciones que devuelven punteros de función
- 5. Haskell FFI: ¿Cómo envuelve las colecciones de C++?
- 6. C: ¿Cuál es mejor? Malloc matriz de punteros a las estructuras, o una matriz de estructuras?
- 7. Llamando punteros a funciones C++ de las bibliotecas C
- 8. Punteros a la función C++/C que devuelven el vacío *
- 9. ¿Las funciones de MongoDB stats() devuelven bits o bytes?
- 10. cómo manejar la señal en las ventanas con haskell?
- 11. En TypeScript, ¿cómo declaro una matriz de funciones que aceptan una cadena y devuelven una cadena?
- 12. Acerca de los punteros a las funciones en las declaraciones de funciones
- 13. Objetos de Microsoft, las funciones Release() devuelven valor?
- 14. Cómo son inseguros los punteros a las funciones
- 15. importando tipos de datos C++ a haskell con ffi
- 16. Calling Haskell FFI Función PAD de C
- 17. C++: matriz de punteros de función miembro a diferentes funciones
- 18. funciones que devuelven el puntero de char
- 19. Examinando las partes internas de las funciones en Haskell
- 20. C# "O" evento delegados que devuelven bool
- 21. C# "Las estructuras de este = ...."
- 22. Copie dos estructuras en C que contengan punteros de char
- 23. haskell generar el código de contenedor de exportación FFI
- 24. ANSI C: ¿Por qué las funciones de caracteres aceptan el argumento int en lugar del argumento char?
- 25. C# gestión de cadenas en las estructuras
- 26. ¿Cómo usar las estructuras C que contiene objetos ObjC?
- 27. ¿Cómo puede manejar MSVC6 las excepciones de las funciones externas "C"?
- 28. FFI en Haskell, pregunta sobre el CPP IDIOMA y cómo utilizar ac estructura con la FFI
- 29. funciones dentro de las funciones en C
- 30. ¿Cómo manejar las funciones de desactivación en la biblioteca?
¿Está buscando algo como [esto] (http://www.haskell.org/haskellwiki/FFICookBook#Working_with_structs). –
Solo para confirmar: ¿desea pasar la estructura por valor, no por referencia? –
@ Don sí, eso es correcto. – Cubic