可存储空数据声明

2024-01-04

我正在尝试为 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类是Storable。所以我可以通过使用来实现我的目标peek on ptr打电话之前get_struct:

main = alloca $ \ptr -> do
  ptr <- peek ptr
  get_struct ptr

不过,这感觉就像是黑客攻击。

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


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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

可存储空数据声明 的相关文章

  • 包含原始指针的结构可以实现 Send 并且 FFI 安全吗?

    我有一个场景 Rust 会调用 Cmalloc缓冲区并将结果指针存储到结构中 稍后 该结构将被移动到线程并传递给 C 函数 该函数会对其进行变异 我的问题的天真的方法看起来像这样 extern crate libc use libc c v
  • 模式匹配中的 Monoid mempty

    我尝试写一个通用的maximum功能类似于Prelude 我的第一个天真的方法如下所示 maximum F Foldable a Ord b gt a b gt Maybe b maximum mempty Nothing maximum
  • 哈斯克尔状态单子

    是否putState Monad 的函数会更新实际状态还是仅返回具有新值的新状态 我的问题是 State Monad 可以在命令式设置中像 全局变量 一样使用吗 并且确实put修改 全局变量 我的理解是 不 它不会修改初始状态 但是使用单子
  • 仪器化状态单子

    我正在努力给予Monad and MonadState的实例State 计算的数量 gt gt return get and put运营 data Counts Counts binds Int returns Int gets Int p
  • 在生成此 SOP 函数时,如何修复类型错误,包括“无法对 Traversable 进行量化”?

    我只是说我什至不确定这是否可能 这是迄今为止我在 Haskell 中尝试过的最通用的事情 我正在尝试制作一个更通用的版本applyFunc在发现https stackoverflow com a 58890226 3096687 https
  • Haskell 真的是纯粹的吗(有任何语言可以处理系统外的输入和输出)吗?

    在谈到函数式编程中的 Monad 后 该功能是否真的使语言变得纯粹 或者它只是黑板数学之外的现实世界中计算机系统推理的另一张 免狱卡 EDIT 这不是有人在这篇文章中所说的火焰诱饵 而是一个真正的问题 我希望有人能用它来击倒我并说 证明 它
  • 算法 - 如何有效删除列表中的重复元素?

    有一个list L 它包含以下元素任意类型each 如何有效删除此类列表中的所有重复元素 必须保留订单 只需要一个算法 因此不允许导入任何外部库 相关问题 在Python中 从列表中删除重复项以使所有元素都是唯一的最快算法是什么在维持秩序的
  • 表达式“ap zip tail”如何工作

    我想知道怎么写f x zip x tail x 点免费 所以我使用了pointfree程序 结果是f ap zip tail ap作为 Control Monad 的函数 我不明白点自由定义是如何工作的 如果我能从类型的角度去理解的话 希望
  • 不同 hs 文件中的函数分离时堆栈空间溢出

    我有一个巨大的 haskell 文件 它编译和运行没有任何问题 我想将一些函数和类型定义放在通用 hs 文件中的单独模块中 然后将其导入我的主模块中 虽然主程序编译时没有任何错误 它还编译导入的模块 但当我尝试运行它时 出现堆栈空间溢出 I
  • 可以通过Data.Function.fix来表达变形吗?

    我有这个可爱的fixana这里的函数执行速度比她的姐妹快 5 倍左右ana 我有一个criterion报告支持我这一点 ana alg Fix fmap ana alg alg fixana alg fix f gt Fix fmap f
  • Haskell 二进制解析

    我一直在尝试在 haskell 中实现一个协议解析器 而且我对这门语言还很陌生 特别是当涉及到 monad 时 我一直在使用binary 0 5 0 2 并描述了协议的标头和所有有效负载 我想要解析的消息如下所示 header payloa
  • 为什么haskell中的递归列表这么慢?

    我对 Haskell 很陌生 我在 Haskell 中定义了一个函数 febs Integral a gt a gt a febs n n lt 0 0 n 1 1 n 2 1 otherwise febs n 1 febs n 2 但是
  • 如何找到仅是 2、3 和 5 的幂的倍数的所有数字的列表? [复制]

    这个问题在这里已经有答案了 I am trying to generate a list of all multiples which can be represented by the form where a b and c are w
  • 我应该使用镜头中的什么来按索引构建只读吸气剂?

    我有一个内部细节被隐藏的类型 我想提供某种镜头 可以在特定索引处读取所述类型的元素 但是not修改它们 一个Ixed我的类型的实例似乎没有做我想要的事情 因为它明确允许修改 尽管不允许插入或删除 如果我想允许只读索引 我不确定我使用什么 如
  • 处理许多不相关的类型时避免样板

    我正在编写处理以下值的代码语言 扩展 注释 语法 http hackage haskell org packages archive haskell src exts 1 1 4 doc html Language Haskell Exts
  • 带有查询参数的渲染 url

    无法找到简单问题的解决方案 答案应该是显而易见的 如何在 hamlet 模板中使用查询参数渲染 url I e ItemsR 将生成http localhost 3000 items我如何生成类似的东西http localhost 3000
  • 管道中缺少 ResourceT 实例

    我在尝试使用时遇到奇怪的错误ResourceT http hackage haskell org package conduit 1 0 9 1 docs Data Conduit html t 3aResourceT来自管道 1 0 9
  • 地图不是接受一个函数而列表返回一个列表吗?

    map2 List a gt b gt c gt a gt b gt c map2 List f map2 List f a as bs map f a bs map2 List f as bs 这是我的讲座中的一个示例 它尝试将二元函数应
  • 如何避免编写这种类型的 Haskell 样板代码

    我经常遇到这种情况 这很烦人 假设我有一个 sum 类型 它可以保存一个实例x或一堆其他无关的事情x data Foo x X x Y Int Z String other constructors not involving x 要声明
  • 为什么 Haskell 中的点是从右向左排列的?

    如果我们有两个函数 f and g 然后在哈斯克尔h f g相当于h x f g x IE 这些函数从右到左应用于输入 有什么根本原因可以解释为什么它是从右到左 而不是从左到右吗 IE 他们为什么不做h f g相当于h x g f x 反而

随机推荐

  • 具有多个 OR 的 IMAP 标准

    我正在使用 gmail 的 IMAP API 来搜索邮件 我使用 OR 条件来搜索不同的关键字 如果我只进入一个级别 这很有效 即类似 UID SEARCH OR FROM email protected cdn cgi l email p
  • 根据类似于 mysql 的标签选择相关标题

    TAGS tag id post id value 1 1 some 2 1 good 3 1 title 4 2 some 5 2 good 6 3 some 7 4 good 8 4 title POSTS post id title
  • Objective-C 是否禁止使用结构体?

    我是 Objective C 新手 我尝试使用一个简单的struct and got arc forbids objective c objects in struct 查找 ARC http clang llvm org docs Aut
  • Android:从设备浏览并上传应用程序中的 PDF 或 Word 文件

    我正在创建一个 Android 移动应用程序 用户可以在其中上传他 她的简历 然后将其发送到服务器 简历可以是 pdf 格式或 word 格式 如何浏览pdf和word文件 应该选择哪种类型来浏览这些文件 就像图像一样 我们有图像 Than
  • 添加新数据后如何刷新我的 datagridview

    我在寻找刷新 datagridview 的方法时遇到了很多麻烦 我尝试过 datagridview refresh datagridview Update 但它不起作用 这是我的代码 Imports System Data Imports
  • 在 MAC 中为 Eclipse 设置 JDK

    我买了一台 MacBookPro 我是这个操作系统的新手 我从 Oracle 网站下载了 JDK 并安装了它 Library Java JavaVirtualMachines jdk 1 7 所以当我输入 java version 时一切都
  • 在页面上显示 php 生成的图像

    我有一个用于修改图像的函数 我想在我的页面上与其他页面内容一起显示这些图像 PHP图像函数
  • 为什么我使用=(单个等于)的相等比较不能正常工作? [复制]

    这个问题在这里已经有答案了 我正在尝试检查字符串是否为空 小于或等于 9 位数字或最多 10 位数字 但它始终遵循else if str length lt 9 if str console log The string cannot be
  • 如何像 Wildfireapp 和其他人一样通过 Graph API 动态注册 Facebook 应用程序?

    我正在尝试创建一个抽奖应用程序 我正在尝试复制wildfire http wildfireapp com 但我无法像他们那样动态创建 Facebook 应用程序 我检查了他们正在使用图形 api 在前端显示 但图形 api 中没有可用的方法
  • 如何检索 MongoDB 中对象内的不同键

    我在 MongoDB 中有这个 id ObjectId 58fb35531eb5df245d5d434f name d1 html indexation Citroen 1 color 1 Marca 1 rojo 1 id ObjectI
  • 图表:带状线和曲线交点

    我在没有很多数据点的正弦曲线类型图中添加了一条水平带状线 有没有办法找到x坐标交点 您可以通过分析来解决它 即如果您的数据是从公式导出的 您可以使用数学来求解交集 或者你可以在以下方面的帮助下得到一个近似值GDI 正如您发现使用DataPo
  • UITableView中如何设置表头的高度?

    我已经浏览了有关 UITableView 类和委托参考的 Apple 文档 但找不到显式设置表头高度的方法 我使用以下委托设置表格单元格高度 CGFloat tableView UITableView tableView heightFor
  • 具有多个字段的 LINQ OrderBy

    我有一个列表 需要按两个字段排序 我尝试过在 LINQ 中使用 OrderBy 但这只允许我指定一个字段 我正在寻找要按第一个字段排序的列表 然后如果第一个字段中有任何重复项 则按第二个字段排序 例如 我希望结果看起来像这样 按姓氏然后名字
  • 每个 React 类方法的“函数缺少返回类型”

    我的 Typescript 项目中有一个有状态的 React 组件 我使用 ESLint 来检查它 typescript eslint parser and typescript eslint eslint plugin 我已启用该规则 t
  • setup.py/setup.cfg 安装所有附加功能

    我在 setup cfg 中寻找 继承 其他附加功能的可能性 如下所示 options extras require all
  • .Net 的 Prolog 编译器

    任何人都可以推荐一个用于 Net 的 Prolog 编译器吗 我在网上搜索到的那些似乎已经好几年没有更新了 Thanks Shiraz 在这篇文章中他们推荐P http homepages inf ed ac uk stg research
  • AdRequest.Builder 无法解析为类型

    我正在将 AdMob 合并到我的应用程序中 我已按照开发人员页面中的步骤进行操作 然而 AdRequest Builder 带有红色下划线 它表示 AdRequest 无法解析为类型 and AdRequest Builder 无法解析为类
  • 程序如何在内存中运行以及操作系统处理内存的方式

    我不清楚进程执行时的内存管理 在运行时 Here is a diagram 我不清楚图像中的以下内容 1 该图像所指的堆栈是什么 2 什么是内存映射段 它指的是文件映射 3 堆与进程有什么关系 堆是仅在进程中处理还是堆是由操作系统内核维护的
  • $(位置).attr('href');不工作

    我不知道为什么 但我对这段代码有问题 横幅显示在每个页面上 尽管它指定了属性 location attr href 您可以帮助我吗 div div class bottom content a href http www cliente o
  • 可存储空数据声明

    我正在尝试为 C 库创建 Haskell 包装器 底层结构太复杂 无法表达为显式类型 而且除了在 C 函数之间传递之外 我实际上并不使用它们 所以我使用EmptyDataDecls让 GHC 帮我解决这个问题 我需要的是一个指向这些数据类型