考虑一个如下所示的 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/