当然,答案是以某种方式传递/获取一个连续的内存块,所以问题更多是关于如何做到这一点。现在我仍然可以通过在 C 端编写包装函数来避免这个问题,但这并不是一个永久的解决方案。
问问题
1184 次
1 回答
15
FFI 不支持任意按值传递 Haskell 可存储类型。
您只能传递类型的值(其中一些是指针):
Int#, Word#,
Char#,
Float#, Double#,
Addr#,
StablePtr# a, MutableByteArray#, ForeignObj#, and ByteArray#.
因此,要传递一个结构,您必须通过 C 包装器包装调用;它接受一个指针并将其值传递给您希望实际调用的 C 函数。
最近的 GHC 扩展允许“primop”导入——它绕过 FFI 机制并支持任意调用约定和通过未装箱的元组传递结构。例如
foreign import prim "ITCHv41_run"
parseITCHv41# :: Addr# -> Word#
-> (# Int#, Word#, Word#, Word#, Word#, Word# #)
你可以使用这些来做像这样棘手的低级事情。
于 2012-06-05T20:24:51.900 回答