我有很多 C 结构体,结构如下
typedef struct {
unsigned int a;
unsigned int b;
} StructA;
还有很多功能,比如
void doSomethingWith(StructA*,StructB*,StructC*);
有没有一种简单的方法可以使用 Haskell FFI 调用这些函数?比如,有没有像 C 语言中的 & 运算符一样的东西? (我想没有,但如果有的话我想知道)。我是吗have使 Haskell 方面data
的可存储实例(我没有这些结构的任何构造函数)。
另外:如果我必须传递一个结构而不是一个结构指针(不是假设的问题,我有一些类似的函数 - 这不是我的代码,所以我无能为力),我可以只传递以下组件吗结构代替?就像我想打电话一样
void function(StructA);
我可以这样做吗
foreign import ccall "function" :: CUInt -> CUInt -> IO()
?
要将 Haskell 数据的引用传递给 C,其中内存在 Haskell 堆中分配,并且 C 将直接操作数据,您需要:
- 确保它在内存中具有正确的形状(通过Storable http://hackage.haskell.org/packages/archive/base/4.3.0.0/doc/html/Foreign-Storable.html#t%3aStorable将 A 映射到相同字节结构的实例
StructA
).
- 在 Haskell 堆上分配并填充固定内存,通过mallocForeignPtr http://www.haskell.org/ghc/docs/latest/html/libraries/base/Foreign.html#v%3amallocForeignPtr
这种方法有几个后果需要考虑:
- 一旦您删除了对ForeignPtr的所有引用,GHC将取消分配该值——因此您需要确保C端不会再次触及它
- 你让 C 弄乱了 Haskell 堆上的东西,所以要确保它是正确的
其他选项:
- 通过 a 将不透明引用传递给 C
StablePtr
- 在 C 端分配内存,并使用终结器释放它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)