gpt4 book ai didi

haskell - 可存储空数据声明

转载 作者:行者123 更新时间:2023-12-03 15:10:39 25 4
gpt4 key购买 nike

我正在尝试为 C 库创建一个 Haskell 包装器。底层结构过于复杂,无法表示为显式类型,除了在 C 函数之间传递之外,我实际上并没有使用它们,所以我使用 EmptyDataDecls让 GHC 为我解决这个问题。

我需要的是一个指向这些数据类型之一的指针,但是当我尝试使用 alloca 创建一个时它提示数据不是 Storable 类型.例如:

{-# LANGUAGE ForeignFunctionInterface, EmptyDataDecls #-}

module Main where

import Foreign.Marshal.Alloc
import Foreign.Ptr

data Struct

foreign import ccall "header.h get_struct"
get_struct :: Ptr Struct -> IO ()

main = alloca $ \ptr -> get_struct ptr

GHC 不会编译这个,说没有 Storable Struct 的实例.我可以自己实现它:
instance Storable Struct where
sizeOf _ = ...
alignment _ = ...

但这接近于违背目的 - 如果我不关心结构中的内容,我不想定义这些东西。

我注意到指向指针的指针工作正常,因为 Ptr类(class)是 Storable .所以我可以通过使用 peek 来完成我的目标。在 ptr在调用 get_struct 之前:
main = alloca $ \ptr -> do
ptr <- peek ptr
get_struct ptr

不过,这感觉像是一种黑客行为。

有没有办法让空数据声明被考虑 Storable没有定义实例?

最佳答案

如果你不知道它有多大,你就不能分配它。该函数是否会忽略其参数?然后传入一个空指针。否则,您实际上需要为结构分配足够的空间 - 不要通过分配零字节或指针大小的缓冲区来偷工减料,因为这样调用的函数将写入缓冲区的末尾,从而破坏内存。

要么完成数据声明,要么编写一个具有适当大小和对齐值的 Storable 实例;无法以某种形式提供大小/对齐数据。

关于haskell - 可存储空数据声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4794644/

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