c - Haskell FFI 将多个数组传递给 C

标签 c haskell ffi

我有一个类型为 C 的函数

int func(int len1, int *array1, int len2, int *array2);

我想从 Haskell 打电话。它不会修改其内容。我想传递列表中的数据。我一直在浏览Foreign.Marshal.Array,但我很困惑。 newArray 或 withArray 似乎都能满足我的要求,但例如 withArray 接受一个具有类型的函数

Ptr a -> IO b

鉴于函数中的两个数组,我不太确定如何处理这个问题。到目前为止,我已经:

foreign import ccall unsafe "func.h func"
    c_func :: CInt -> Ptr CInt -> CInt -> Ptr CInt -> IO CInt

我不知道如何调用它。在文档(https://wiki.haskell.org/Foreign_Function_Interface#Arrays)中,它只是说读取Foreign.Marshall.Array。

谢谢!

编辑:拼写错误。

最佳答案

withArray* 函数在函数范围内为您提供一个Ptr。您可以将其编写为内联 lambda,如下所示:

func :: [CInt] -> [CInt] -> IO CInt
func list1 list2 =
    withArrayLen list1 $ \len1 array1 ->
      withArrayLen list2 $ \len2 array2 ->
        c_func (fromIntegral len1) array1 (fromIntegral len2) array2

例如,您也可以单独计算长度

func list1 list2 =
    withArray list1 $ \array1 ->
      withArray list2 $ \array2 ->
        c_func len1 array1 len2 array2
  where
    len1 = genericLength list1
    len2 = genericLength list2

关于c - Haskell FFI 将多个数组传递给 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44512077/

相关文章:

c - 示例 mq_timedreceive

haskell - 重叠实例可以,但仍然失败

haskell - haskell中的同时递归关系

c - 编译 C 程序时无法链接到 Rust 编译的库

rust - 如何在 Rust 中初始化 sigset_t 或其他用作 "out parameters"的变量?

c - 动机的功能搜索给出了大写字母的错误

c - mpicc 和矩阵

c - long and = ((long) INT MIN) * 2 - 1;由于整数溢出导致警告

Haskell 中的函数守卫和 'where' 语法

pointers - Rust - 包装 FFI 指针