Arrays 外国金融机构能处理阵列吗?如果是,怎么做?

Arrays 外国金融机构能处理阵列吗?如果是,怎么做?,arrays,haskell,ffi,Arrays,Haskell,Ffi,我很确定可以通过FFI发送数组,但我找不到任何示例。例如,我有一个Haskell数组,发送给intfoo(int*)函数,或者我有一个C数组intbar[64] 理想情况下,我希望使用最有效的方法—我不希望进行任何堆分配或不必要的复制。另外,如果我能在Haskell和C中都使用Haskell的非固定数组,那就太好了。那么这样做的方法是什么呢 FFI规范可读性很强,因此您可能想坐下来仔细研究一下整个过程。但是,对于这个特定的问题,您可以跳转到“编组”部分,特别是和小节,其中概述了可用于此的内容。与

我很确定可以通过FFI发送数组,但我找不到任何示例。例如,我有一个Haskell数组,发送给
intfoo(int*)
函数,或者我有一个C数组
intbar[64]


理想情况下,我希望使用最有效的方法—我不希望进行任何堆分配或不必要的复制。另外,如果我能在Haskell和C中都使用Haskell的非固定数组,那就太好了。那么这样做的方法是什么呢

FFI规范可读性很强,因此您可能想坐下来仔细研究一下整个过程。但是,对于这个特定的问题,您可以跳转到“编组”部分,特别是和小节,其中概述了可用于此的内容。

与C中一样,数组基本上是指向数组第一个成员的指针。通过对指针进行算术运算,可以得到其他元素。
Ptr
Num
的成员,因此您可以使用常用的算术运算。

如果使用Data.Vector库,您可以根据需要使用Data.Vector.Storable。然后,您可以使用unsafetoforewingptor或unsafeWith等函数来访问底层外部指针。这允许您在不进行任何复制或封送处理的情况下调用C代码

如果要从C数组创建向量,可以使用unsafeFromForeignPtr

对于您的示例,您可以使用(假设c_foo不修改其参数)

这可以归结为:

haskellFoo sv = unsafePerformIO $
    SV.unsafeWith sv (return . c_foo)
请注意,如果您的C函数修改了数据,那么您不应该这样做,而是应该这样做 制作数据副本以不破坏引用透明度


如果要使用标准数组类型,可以使用
Data.Array.Storable
中的
with storablearray
,方法相同

要将FFI Ptr转换为Haskell列表,您可以使用:

peekArray0 :: (Storable a, Eq a) => a -> Ptr a -> IO [a]

True,但Haskell指针算法以字节为单位。因此,在C语言中,您需要编写
aPtr+=1
以移动到数组的下一个元素,在Haskell中,您需要编写
next=aPtr+1*sizeOf element
。或者你可以使用
Foreign.marshall.Array.advancePtr
。当我导入
Foreign
Foreign.Ptr
时,我没有看到
Num
用于
Ptr
的实例,你从哪里得到的?你的高尔夫版本没有使用
sv
参数,我猜你只是不小心漏掉了它(我试图编辑你的答案,但坚持要编辑≥ 6个字符:()@benmachine:为您修复了:)请参阅。
peekArray0 :: (Storable a, Eq a) => a -> Ptr a -> IO [a]