Haskell FFI 将多个数组传递给 C
Haskell FFI passing multiple arrays to C
我有一个类型为
的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函数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