Haskell FFI - 你能从Haskell数据结构中获得一个C指针吗?

时间:2012-06-05 15:36:41

标签: c haskell ffi

我有很多C结构,如

typedef struct {
    unsigned int a;
    unsigned int b;
} StructA;

还有很多功能,比如

void doSomethingWith(StructA*,StructB*,StructC*);

有没有一种简单的方法可以使用Haskell FFI调用这些函数?就像,有什么东西像& amp; C中的运算符? (我想没有,但如果我想知道的话)。我来使Haskell端data的可存储实例(我没有这些结构的任何构造函数)。

另外:如果我必须传递结构而不是结构指针(不是假设的问题,我有一些类似的函数 - 它不是我的代码,所以我不能做任何事情),我可以通过结构的组件相反?就像我想打电话一样

void function(StructA);

我可以用

做到这一点
foreign import ccall "function" :: CUInt -> CUInt -> IO()

1 个答案:

答案 0 :(得分:4)

要将对Haskell数据的引用传递给C,其中内存在Haskell堆中分配,而C将直接对数据进行操作,您需要:

  • 确保它在内存中具有正确的形状(通过将{A}映射到与StructA相同的字节结构的Storable实例。)
  • 通过mallocForeignPtr
  • 在Haskell堆上分配和填充固定内存

这种方法需要考虑几个后果:

  • GHC将在您删除对ForeignPtr的所有引用后取消分配值 - 因此您需要确保C端不会再次触及它
  • 你让C搞乱Haskell堆上的东西,所以要确保它正确

其他选择:

  • 通过StablePtr
  • 将不透明引用传递给C.
  • 在C端分配和内存,并使用终结器来释放它。