gpt4 book ai didi

arrays - Haskell Data.Vector.Storable.unsafeFromForeignPtr 与 C 结构指针/数组字段

转载 作者:行者123 更新时间:2023-12-01 05:12:02 25 4
gpt4 key购买 nike

我将 Haskell FFI 与一个 C 库一起使用,该库定义了许多 struct 类型,这些类型包含指向 double 的指针,旨在被视为 double 的数组:

typedef struct Foo {
int length;
double* values;
} FooT;

在我与这个库的 Haskell 绑定(bind)中,我有一个等效的数据类型,我试图将 Data.Vector.Storable.Vector Double 用于数组:
data Foo = Foo {
length :: Int,
values :: Data.Vector.Storable.Vector Double
} deriving (Show, Eq)

为了在 C 库和我的 Haskell 代码之间编码数据,当然,我必须为这些类型编写 Storable 实例。我正在尝试找出一种使用 Data.Vector.Storable.unsafeFromForeignPtr 从 C 库已分配并填充在堆上的 Vector 数组创建 Haskell double* 的方法。我希望通过这样做,我可以避免复制 double* 数组的内容,而只需将 Vector 作为数组的一种包装器。 (附带的问题是:鉴于 double* 数组可以多达 10,000 个 double s,是否值得追求这种非复制?)

这就是我到目前为止所拥有的。我正在使用 hsc2hs 宏来帮助生成 Storable peek 实现:
instance Storable Foo where
alignment _ = alignment (undefined :: CDouble)
sizeOf _ = #{size FooT}

peek ptr = do
len <- (#peek FooT, length) ptr
valuesField <- ((#peek FooT, values) ptr) :: IO (ForeignPtr Double)
let values' = DV.unsafeFromForeignPtr0 valuesField len

return Foo { length = len, values = values' }

poke ptr (Foo len values') = do
(#poke FooT, length) ptr len
DV.unsafeWith values' (\ptrValues -> (#poke FooT, values) ptr ptrValues)

因此,在我的 peek 中,我尝试将 #peek 成员作为 values 成员,然后我可以将其与 ForeignPtr Double 一起使用。但是, unsafeFromForeignPtr 会生成如下代码:
valuesField <- (((\ hsc_ptr -> peekByteOff hsc_ptr 16)) ptr) :: IO (ForeignPtr Double)

并被卡住,因为 #peek 没有 Storable 实例。我想如果我尝试为 ForeignPtr Double 实现一个实例,我只会将如何访问 ForeignPtr Double 成员的地址值的问题转换为该实例的 struct 实现。

总而言之,我怎样才能访问地址值(即指针) peek 成员,以便我可以将其用作 struct 的参数?

最佳答案

我不知道如何使用 hsc2hs,但您已经有了指向 peek 中数据的指针所以你只需使用它,当然还有适当的偏移量。免责声明:这可以编译,但未经测试。

import Data.Vector.Storable (Vector, unsafeFromForeignPtr)
import Foreign.Storable (Storable (..))
import Foreign.C.Types
import Foreign.ForeignPtr (newForeignPtr_)
import Foreign.Ptr

instance Storable Foo where
peek ptr = do
len <- peek (castPtr ptr)
valsPtr <- newForeignPtr_ (castPtr ptr `plusPtr` (sizeOf (undefined :: CInt)))
return $ Foo len $ unsafeFromForeignPtr valsPtr 0 len

关于arrays - Haskell Data.Vector.Storable.unsafeFromForeignPtr 与 C 结构指针/数组字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24097259/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com