c - 通过 FFI 在 C 和 Haskell 之间传递类结构数据

标签 c haskell ffi

考虑一个如下所示的 Haskell 数据类型

data MyData = MyData { arrInt :: [Int] , arrDouble :: [Double], arraySize :: N }

这里的 N 代表两个数组和 MyData 记录的大小。

是否可以将此(或 MyData 对象的某种 Haskell“指针”)传递给如下所示的 C 函数。

int myfunc (int* a, double* b, int N)

我能够使用 FFI 调用 C 函数来接受和返回简单的数据类型,如 Double、Int、Char 等。但是对于更复杂的类型,我不知道该怎么做。

最佳答案

你可以这样做:

import Foreign
import Foreign.C

myfunc :: MyData -> IO CInt
myfunc d =
    withArray (map fromIntegral $ arrInt d) $ \arr1 ->
        withArray (map CDouble $ arrDouble d) $ \arr2 ->
            c_myfunc arr1 arr2 (fromIntegral $ arraySize d)

foreign import ccall safe "myfunc"
    c_myfunc :: Ptr CInt -> Ptr CDouble -> CInt -> IO CInt

关于c - 通过 FFI 在 C 和 Haskell 之间传递类结构数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39309749/

相关文章:

c - 我怎样才能打破 gdb 中的 UBSan 报告并继续?

haskell - F# 歧视联合中的函数

haskell - 在删除不透明的 FFI 对象之前,垃圾回收需要多长时间?有可能以某种方式加快速度吗?

javascript - 模块名称是绑定(bind)中使用的隐藏全局名称

pointers - Haskell 中的低级指针

c - 解决C中的segmentation fault错误

c - libclang : error: clang-c/Index. h: 没有那个文件或目录

c - 指针/结构体 (C) - IDE : Eclipse

haskell - 如何否定一个函数?

Haskell - 如何转换 map 总和( map (x :) xss) to map (x+) (map sum xss)