2

我有很多 C 结构,如

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

还有很多功能,比如

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

有没有一种简单的方法可以用 Haskell FFI 调用这些函数?就像,有什么东西表现得像 C 中的 & 运算符吗?(我想没有,但如果有我想知道)。我是否必须使 Haskell sidedata的可存储实例(我没有这些结构的任何构造函数)。

另外:如果我必须传递一个结构而不是一个结构指针(不是一个假设的问题,我有一些这样的函数 - 这不是我的代码,所以我无能为力),我可以只传递结构代替?就像我想打电话一样

void function(StructA);

我可以这样做吗

foreign import ccall "function" :: CUInt -> CUInt -> IO()

?

4

1 回答 1

4

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

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

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

  • 一旦您删除了对 ForeignPtr 的所有引用,GHC 将取消分配该值——因此您需要确保 C 端不会再次触及它
  • 你让 C 把 Haskell 堆上的东西弄乱了,所以要确保它是正确的

其他选项:

  • 通过 a 传递对 C 的不透明引用StablePtr
  • 在 C 端分配和内存,并使用终结器来释放它。
于 2012-06-05T15:59:38.140 回答