我相信可以通过 FFI 发送数组,但我找不到任何示例。例如,我有一个发送到 int foo(int*)
函数的 Haskell 数组,或者我有一个 C 数组 int bar[64];
要发送到 Haskell。
最理想的方式是最高效的方式 - 我不希望有任何堆分配或不必要的复制。此外,如果我可以在 Haskell 和 C 中都使用未打包的数组将会很好。那么怎么做呢?
import Foreign.Ptr
import Foreign.C.Types
import System.IO.Unsafe (unsafePerformIO)
import qualified Data.Vector.Storable as SV
foreign import ccall unsafe "foo" c_foo :: Ptr CInt -> CInt
haskellFoo :: SV.Vector CInt -> CInt
haskellFoo sv = unsafePerformIO $
SV.unsafeWith sv $ \ptr -> return (c_foo ptr)
haskellFoo sv = unsafePerformIO $
SV.unsafeWith sv (return . c_foo)
sv
参数,我猜想你只是不小心省略了它(我试图编辑你的回答,但 SO 坚持我的编辑必须≥ 6 个字符 :( ) - Ben MillwoodpeekArray0 :: (Storable a, Eq a) => a -> Ptr a -> IO [a]
Ptr
是 Num
的成员,因此您可以使用通常的算术运算符。aPtr += 1
来移动到数组的下一个元素,在 Haskell 中,您需要写 next = aPtr + 1*sizeOf element
。或者您可以使用 Foreign.Marshal.Array.advancePtr
。 - John LForeign
或 Foreign.Ptr
时,我没有看到 Ptr
的实例 Num
,你是从哪里获取的? - Ben Millwood
Foreign.Marshal.Array
。 - MasterMastic