Haskell FFI - 你能从 Haskell 数据结构中获取 C 指针吗?

2024-04-27

我有很多 C 结构体,结构如下

typedef struct {
    unsigned int a;
    unsigned int b;
} StructA;

还有很多功能,比如

void doSomethingWith(StructA*,StructB*,StructC*);

有没有一种简单的方法可以使用 Haskell FFI 调用这些函数?比如,有没有像 C 语言中的 & 运算符一样的东西? (我想没有,但如果有的话我想知道)。我是吗have使 Haskell 方面data的可存储实例(我没有这些结构的任何构造函数)。

另外:如果我必须传递一个结构而不是一个结构指针(不是假设的问题,我有一些类似的函数 - 这不是我的代码,所以我无能为力),我可以只传递以下组件吗结构代替?就像我想打电话一样

void function(StructA);

我可以这样做吗

foreign import ccall "function" :: CUInt -> CUInt -> IO()

?


要将 Haskell 数据的引用传递给 C,其中内存在 Haskell 堆中分配,并且 C 将直接操作数据,您需要:

  • 确保它在内存中具有正确的形状(通过Storable http://hackage.haskell.org/packages/archive/base/4.3.0.0/doc/html/Foreign-Storable.html#t%3aStorable将 A 映射到相同字节结构的实例StructA).
  • 在 Haskell 堆上分配并填充固定内存,通过mallocForeignPtr http://www.haskell.org/ghc/docs/latest/html/libraries/base/Foreign.html#v%3amallocForeignPtr

这种方法有几个后果需要考虑:

  • 一旦您删除了对ForeignPtr的所有引用,GHC将取消分配该值——因此您需要确保C端不会再次触及它
  • 你让 C 弄乱了 Haskell 堆上的东西,所以要确保它是正确的

其他选项:

  • 通过 a 将不透明引用传递给 CStablePtr
  • 在 C 端分配内存,并使用终结器释放它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Haskell FFI - 你能从 Haskell 数据结构中获取 C 指针吗? 的相关文章

  • 在 C/C++ 中读取和写入二进制文件的中间部分

    如果我有一个大的二进制文件 假设它有 100 000 000 个浮点数 C 或 C 有没有办法打开文件并读取特定的浮点数 而不必将整个文件加载到内存中 即我如何快速找出第 62 821 214 个浮点是什么 第二个问题 有没有办法更改文件中
  • 验证码怎么写?

    我正在开发一个注册表 我想放置验证码 我生成一个随机字符串 但如何将其转换为图像 否则我如何开发验证码或任何参考 谢谢 Try out 验证码 http recaptcha net plugins aspnet 或查看博客文章 使用 Asp
  • 在 Eclipse 4.4.2 中使用 C 代码中的构建变量

    我有一个之前使用 Eclipse 3 5 2 创建的项目 在其中 我能够在项目属性中设置构建变量 在这种情况下 假设我设置了SW VERSION是 4403 现在这应该是一个十六进制数字 所以在构建设置中 我添加了一个符号 VERSION
  • 单击按钮本地化应用程序

    我在我的项目 mainMaster 页面中找到了 imageButtons
  • 如何将文本框中删除的字符替换为0

    在winforms中 如何用零替换删除的字符 例如 文本框中为 12 45 如果我们删除小数点后 它应该变成12 00 同样的方法删除前面的000 45 默认值应为 000 00 Use a 蒙版文本框 http msdn microsof
  • ReportViewer“缺少 URL 参数:名称”

    在一个网络应用程序中 我正在处理 ReportViewer 时不断出现错误 缺少 URL 参数 名称 我找到了原因 但没有找到解决方案 导致报告查看器出现异常的 url Reserved ReportViewerWebControl axd
  • 字符串中unicode字符的正则表达式

    我正在使用 C 进行一些 OCR 工作 并提取了我需要使用的文本 现在我需要使用正则表达式解析一行 string checkNum string routingNum string accountNum Regex regEx new Re
  • 无法运行bjam编译boost python教程

    我正在尝试跟随本教程 http www boost org doc libs 1 55 0 libs python doc tutorial doc html python hello html关于为 Windows 的 python 包装
  • 无效的跨线程访问问题

    我有两个 ViewModel 类 PersonViewModel 和 PersonSearchListViewModel PersonViewModel 实现的字段之一是通过 WCF 下载的个人资料图像 本地缓存在独立存储中 PersonS
  • 如何从子窗口中加载的用户控件按钮关闭子窗口?

    这是我的 ChildWindow xaml 代码 1
  • WinForms TreeView - 如何手动“突出显示”节点(就像被单击一样)

    我需要知道如何让以编程方式选择的节点以图形方式处于 选定 状态 就像用户单击它一样 SelectedNode 仅使这一节点在内部被选中 非常感谢 它没有显示为突出显示的原因是由于树视图没有焦点 这是我的测试表单上的按钮单击事件 TreeVi
  • 是否可以在三元表达式上只放置一个选项?

    我只是好奇这是否可能 或者是否有办法使它成为 C 的有效语法 expression value do nothing here or put some empty block like SomeClass SomeMethod Edit 为
  • GCC 和 -Wconversion

    让我们编译以下程序 int main uint16 t data 0 data uint16 t std round 3 14f return 0 with g Wconversion prog cpp 我们会得到warning conve
  • 如何在 Datagridview 中为图像列提供超链接

    如何在winforms中超链接到DataGridViewImageColumn OP 评论中的代码示例 DataGridView dgv new DataGridView dgv Name dgv i dgv DataSource dsMa
  • 使用来自不同线程的实时数据更新 QTableView 的最佳策略

    我的应用程序现在启动几个线程 如 5 10 个 来从不同源收集数据 它们与主 GUI 线程分离 因此我在 GUI 中感觉不到任何缓慢 并且我可以在后台线程工作时继续工作 一切都很棒 但现在我希望能够在我的主 GUI 中的 QTableVie
  • 从 Asp.Net Core 控制器返回 IAsyncEnumerable 和 NotFound

    返回一个控制器操作的正确签名是什么IAsyncEnumerable
  • 使用 JSON.NET 反序列化一些 JSON

    我对 JSON 非常陌生 我需要解析 API 提供的一些内容 谷歌快速搜索出现了JSON NET http james newtonking com pages json net aspx 所以我现在尝试使用它将此 JSON 解析为列表对象
  • WCF - IsOneway 的行为不像 Oneway 操作

    我已在服务的某些方法上定义了 OneWay 属性 但它们的行为并不像 Oneway 调用 我的客户等待呼叫完成并从服务返回 我假设单向操作是非阻塞操作 并且客户端不关心被调用函数会发生什么 它只是调用并忘记它 这是对的吗 问题 调用 Ope
  • 计算 .NET Core 项目的代码指标?

    我正在研究 ASP NET Core 和 NET Core 项目 对于经典的 C 项目 Visual Studio 2015 具有计算代码指标的功能 对于 NET Core 预览版 2 工具中缺少支持 在工具更加完整之前 有人知道解决方法吗
  • win32 内容已更改,但除非移动窗口,否则不会显示更新

    我的 win32 GUI 内容每秒都会更改 但除非手动移动窗口 否则不会显示更新 我尝试每秒弹出一个消息框来触发窗口刷新 它成功了 因此 这证明我的内容确实发生了变化 但窗口没有更新 我希望刷新窗口而不是每次都弹出消息框 有没有这样的窗口功

随机推荐

  • 如何在 Bootstrap Modal 中使用 CKEditor?

    如果我使用CKEditor http cksource com ckeditor基于 Bootstrap 模板的 HTML 页面中的插件 效果很好 但是如果我像这样在 Bootstrap Modal 上插入编辑器 div class mod
  • 在 socket.on() 的回调上调度操作

    所以基本上我得到了这个套接字 它工作正常 向我发送 新订单 消息 我正在使用 redux 并且我想分派一个操作 然后减速器会得到它并且我的商店将会更新 但这段代码没有做任何事情 socket on new order order gt re
  • Twitter 错误无法发布推文

    这个错误可能是什么 Could not post Tweet Error 403 Reason Status is a duplicate 实际上这是一条经过编辑的消息 我得到的错误代码为403和原因为Status is a duplica
  • AttributeError:该层从未被调用,因此没有定义的输入形状

    我尝试通过创建三个类在 TensorFlow 2 0 中构建自动编码器 Encoder Decoder 和 AutoEncoder 由于我不想手动设置输入形状 因此我尝试从编码器的 input shape 推断解码器的输出形状 import
  • JSP:已为此响应调用 getOutputStream()

    我正在使用此代码从 FTP 下载文件 我在 tomcat 日志中遇到异常 如下所示 我能够执行我的任务 但我的日志大小增加了很多 Code if file exists if file canRead IE6 SSL PDF Bug htt
  • R 中的高级调试功能?

    R 中是否有任何软件包和 或 hack 可以为调试器提供更多功能 我专门寻找 能够跳过整个循环 无需调用即可单步执行函数调用的能力debug对他们也 设置断点或有效插入的能力browser当我已经在调试器中时调用代码 也就是说 如果我在调试
  • 如何在node.js中将mp3文件更改为wav文件

    我正在尝试将 mp3 文件转换为 wav 文件 但我不知道如何做到这一点 我尝试使用流利的 ffmpeg https www npmjs com package fluent ffmpeg图书馆 但我不知道如何使用它 我终于用 Fluent
  • 从 AspectJ 获取返回值或异常?

    我能够从建议的方法调用中获取签名和参数 但我无法弄清楚如何获取返回值或异常 我有点假设它可以通过使用 around 并继续以某种方式完成 您可以使用after returning and after throwing开头的建议以下文件 ht
  • Android 插件太旧(2.4.0-alpha7)

    我正在使用 android studio 2 4 并收到此错误 显然我必须更新我的 android 插件 但是当我检查 jcenter 的新版本时 唯一的版本 可用的是2 5 0 alpha 预览 02 这会导致完全相同的错误 我还在错误消
  • 无法拦截Android应用程序的流量

    最近 我正在尝试测试和拦截来自开发的应用程序的流量罗莫比尔 我设置了一个代理burp 当然 我已经在我的设备上安装了 burp 证书 因此我可以拦截设备上的其他应用程序 但我无法在 burp suite 上看到相关应用程序的流量 相反 该应
  • Neo4j 入门

    我对 neo4j 完全陌生 很抱歉问这样一个基本问题 我已经安装了 neo4j 我正在使用 shell localhost 7474 webadmin console 我正在寻找一个很好的示例 它使用一些 shell 命令从预先存在的图形数
  • jQuery,将分隔符更改为点并除以两个选定的数字

    var result parseFloat lot2 text parseFloat span Price text result text result 如何将选定值从逗号分隔值转换为点分隔值 有这个函数str replace 但我不知道
  • 向 Rails 中的所有活动链接添加“活动”类?

    基本上 我有很多类似这样的代码 link to t profile business path business class active if current page business path business 这不是很干 我想知道是
  • java中调用父构造函数

    我有两节课Parent and Child 而Parent有一个需要 3 个参数的构造函数 class Parent public Parent String host String path int port 现在我想要Child构造函数
  • 在 Hiera 中进行基本数学运算

    我试图根据自定义事实和基本模数在 hiera 中设置 crontab 的工作日 但我什至不知道这是否可能 我想做这样的事情 cron job command do something user myuser hour instance mi
  • 在 C# 中创建 Cron 作业

    我正在用 C 编写一个调度类型应用程序 并允许用户存储他们想要在特定时间运行的任务 现在 我为他们提供了指定运行频率 每日 每周 每月 以及指定时间的选项 然后将其存储在数据库中 我在理解其背后的伪代码时遇到了一些麻烦 并且正在寻找一些有关
  • std::async 可以调用 std::function 对象吗?

    是否可以使用 std async 调用使用 std bind 创建的函数对象 以下代码无法编译 include
  • 删除 highcharts.com 积分链接

    我刚刚购买高图表 http www highcharts com 但制作人员链接仍然出现在我的图表上 这些图表在我的网站上非常突出 并且扭曲了图表视图 我以为我会有一个选项 那么如何删除它呢 您可以自定义制作人员名单 更改 URL 文本 位
  • android中如何处理图片下载不完整的情况?

    我正在应用程序中下载图像以将其填充到用户界面上 这是我用来下载该图像并将其保存到设备外部存储器的代码 File firstDirectory new File Environment getExternalStorageDirectory
  • Haskell FFI - 你能从 Haskell 数据结构中获取 C 指针吗?

    我有很多 C 结构体 结构如下 typedef struct unsigned int a unsigned int b StructA 还有很多功能 比如 void doSomethingWith StructA StructB Stru