gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:19:50 26 4
gpt4 key购买 nike

我有很多 C 结构,如

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

还有很多功能,比如
void doSomethingWith(StructA*,StructB*,StructC*);

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

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

我可以这样做吗
foreign import ccall "function" :: CUInt -> CUInt -> IO()

?

最佳答案

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

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

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

  • 其他选项:
  • 通过 StablePtr 传递对 C 的不透明引用
  • 在 C 端分配和内存,并使用终结器来释放它。
  • 关于c - Haskell FFI - 你能从 Haskell 数据结构中获得 C 指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10900354/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com