如何将字符串从 Haskell 传递到 C?

2023-12-21

我想做的就是将纯文本字符串从 Haskell 传递到 C。但是,它表示 [Char] 是不可接受的返回类型。我无法在任何地方找到他们认为的原因,也找不到可接受的返回类型。

我正在尝试制作一个非常简单的操作系统映像,我可以使用 Qemu 启动它。

有谁知道如何做到这一点?谢谢。

    {-# LANGUAGE ForeignFunctionInterface #-}

    module Hello where

    import Foreign
    import Foreign.C.String
    import Foreign.C.Types

    hello :: String -> (CString -> IO a) -> IO a
    hello = "Hello, world!"

    foreign export ccall hello :: String -> (CString -> IO a) -> IO a

你想要一个CString.

CString to String:

peekCString :: CString -> IO String

String to CString:

withCString :: String -> (CString -> IO a) -> IO a

还有 Haddock 文档module Foreign.C.String http://hackage.haskell.org/packages/archive/base/latest/doc/html/Foreign-C-String.html.

可以使用的类型的一般列表foreign声明被指定为一部分Haskell 报告中的外部函数接口 http://www.haskell.org/onlinereport/haskell2010/haskellch8.html#x15-1490008.

Edit

好的,这是您可以执行的操作的一个非常小的示例,在某种程度上基于您的示例代码。创建 Haskell 文件CTest.hs包含以下内容:

module CTest where

import Foreign.C

hello :: IO CString
hello = newCString "hello"

foreign export ccall hello :: IO CString

然后创建一个C文件ctest.c包含以下内容:

#include <stdio.h>
#include "CTest_stub.h"

int main (int argc, char *argv[]) {
  hs_init(&argc, &argv);
  printf("%s\n", hello());
  hs_exit();
  return 0;
}

然后编译运行如下:

$ ghc CTest
[1 of 1] Compiling CTest            ( CTest.hs, CTest.o )
$ ghc -o ctest ctest.c CTest.o -no-hs-main
$ ./ctest
hello
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将字符串从 Haskell 传递到 C? 的相关文章

  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile

随机推荐

  • “未为此项目设置输出路径属性”错误

    我在 Visual Studio 2008 中有一个多项目解决方案 我刚刚向该解决方案添加了一个名为 Release VersionIncrement 的新配置 指定 使用发布 配置作为基线 所有项目文件均已使用该配置进行更新 但是 当我尝
  • Android 应用程序中的图像资产保护/加密

    我创建了一个 Android 游戏 其中使用从 TexturePacker 工具生成的 TextureAtlas 我付钱请了一位艺术家来创作优质的资产 所以我有这些漂亮的带有 alpha 的大型 png 文件 包含所有资源 等待任何解压我的
  • 无依赖关系的简单字符串加密

    我需要一个简单的算法来加密 解密字符串 类似于 Base64 但更安全一些 这不是关键任务 我所需要的只是一些字符串操作 不像使用简单的 Base 64 解码器复制字符串并使其易于人类读取那么容易 为什么不使用 AES 由于我的应用程序是使
  • 无法执行 git pull

    我正在尝试做一个git pull并得到错误消息 error The following untracked working tree files would be overwritten by merge
  • 调用窗口模糊时避免元素模糊处理程序(浏览器失去焦点)

    对问题进行阐述 我有一个元素 单击该元素时会收到一个子元素 该子元素被赋予一个模糊处理程序 我希望当浏览器失去焦点 窗口模糊 时不调用该处理程序 为了实现这个目标 我尝试了几种方法 这是我目前的努力 function clicked gen
  • 应用程序中的Web.Config配置错误

    我已经准备好应用程序在托管上上传它 但是当我在服务器上上传文件时 我收到此错误 应用程序中的服务器错误 配置错误 说明 处理服务此请求所需的配置文件期间发生错误 请查看下面的具体错误详细信息并适当修改您的配置文件 解析器错误消息 此配置节不
  • 如何编写一个接受字符串并按频率降序打印字母的函数?

    我到目前为止 def most frequent string d dict for key in string if key not in d d key 1 else d key 1 return d print most freque
  • 识别 DNS​​ 请求的 PID 源 (Windows XP)

    我希望确定发出 DNS 请求的进程 查看查询给了我一个线索 但并不能帮助我确定确切的过程 我可以在 Wireshark 中看到本地端口号 但请求太短暂 无法被 TCPView 接收 有没有可以捕获 DNS 请求和 PID 的日志记录工具 过
  • 强制浏览器在 Angular 环境中清除缓存

    有一个流行的问题是如何在 VanillaJS 应用程序中强制清除浏览器的缓存 普遍的共识是 将 js 脚本的名称或脚本参数设置为新值 强制浏览器清除缓存 https stackoverflow com questions 1922910 f
  • 使用 jQuery 验证插件显示“this[0] 未定义”消息

    我已经开始使用 jQuery 验证插件 我在错误消息的显示方面遇到了一些问题 并且想要创建一个测试页面 我可以在其中尝试一些事情 尽管昨天同样的设置对我有用 但我现在收到以下消息 this 0 is undefined 查看 jQuery
  • 内联 HTML5 SVG 过滤器,不干扰布局

    我需要将以下内联 SVG 过滤器注入到我的 HTML5 文档中
  • setFetchBatchSize 似乎无法正常工作

    我就这个主题问了几个问题 但仍然无法让它发挥作用 我有一个包含 10k 多行人名的核心数据 我在表格视图中显示这些数据 我希望能够搜索并更新表格中的每一个字母 这是非常滞后的 正如建议的那样 我观看了 WWWDC 10 核心数据演示并尝试实
  • 在 iPhone 上使用 HTML 文件输入上传文件

    我正在创建一个 Web 表单 用于将小影片剪辑上传到 HTTP 服务器 但是 虽然我的 HTML 文件输入控件显示在 iPod touch 上 但该按钮完全禁用 我无法单击它来上传文件 我需要做什么才能使用输入控件将文件 例如影片剪辑或图片
  • 在 MS Access 中,如何获取一个表中不在另一个表中的所有行?

    我尝试了很多不同的方法 但总是出现语法错误 我有两个表 表 A 和表 B 它们都有一个 con number 字段作为唯一 ID 我想选择 tableB 中不存在于 tableA 中的所有行 谁能给我这个查询 就像在 MS Access 中
  • 我可以用 make 或 new 在 golang 中制作预填充字符串吗?

    我正在尝试优化 Go 中的 stringpad 库 到目前为止 我发现用已知字符值 例如 0 或 填充字符串 实际上是 bytes Buffer 的唯一方法是使用 for 循环 代码片段是 PadLeft pads string on le
  • 如何“锁定键盘”以防止在 X11/Linux/Gnome 上发送更多按键?

    我正在用 python 为 Ubuntu Linux 编写一个反 RSI 打字中断程序 我希望能够 锁定键盘 以便忽略所有按键 直到我 解锁 它 我希望能够强制用户暂停打字 我想要一些编程方式来 关闭 键盘 几乎立即 直到我的程序稍后释放它
  • 带有下划线的 scala 传递函数产生一个函数而不是一个值

    您好 我正在编写将函数传递给映射的任何可能的变体 我最初的理解是它们都会产生相同的结果 但我发现第 2 3 行实际上产生了不同的输出 而第 4 行对我来说是个谜 def g v Int List v 1 v v 1 val l List 1
  • 在 read_excel 中保留特定列

    我正在将 Excel 文件导入到 R 中 我只想保留 A 列和 C 列而不是 B 列 列按顺序为 A B C 但以下代码也保留 B 列 如何在不使用另一行代码子集的情况下删除 B 列 df lt read excel df xlsm fut
  • WPF 过滤列表框

    我有一个ListBox绑定到字符串列表 我想在输入文本时过滤列表TextBox 我该怎么做 public void ListLoad ElementList new List
  • 如何将字符串从 Haskell 传递到 C?

    我想做的就是将纯文本字符串从 Haskell 传递到 C 但是 它表示 Char 是不可接受的返回类型 我无法在任何地方找到他们认为的原因 也找不到可接受的返回类型 我正在尝试制作一个非常简单的操作系统映像 我可以使用 Qemu 启动它 有