vala - Idris:如何从 Vala/C 调用 Idris 函数并将字符串返回给 C/Vala

标签 vala idris

我有这个玩具 project:

对于 UI,我使用编译为 C 的 Vala 代码。因此我可以在 UI 中显示来自 Idris 的消息。

在 Idris 和 Vala/C 端,我都有这个方法将指针设置为 Idris 函数。所以在 Vala 代码中你可以看到:

global::afni = fn;

使用指向 Idris 函数的指针设置全局变量。 稍后在另一个 Vala 方法中我调用:

    int res = global::afni(0);
    string da_label = @"blah $res";
    Gtk.Label label = new Gtk.Label (da_label);

所以我调用 comFn 函数,该函数是通过存储在 global::afni 中的指针找到的,到目前为止一切顺利,它似乎可以处理整数。

但是我如何让它与字符串一起工作?

我尝试了各种方法来更改类型并返回字符串作为参数,但出现了与无效指针相关的错误

free(): invalid pointer

munmap_chunk(): invalid pointer

最佳答案

Vala有所有权转移的概念。当函数返回一个字符串时,Vala 假定它有责任在使用完它后释放它。 Idris FFI看起来它在虚拟机内分配所有数据并永久管理它。

您可能需要告诉 Vala 返回类型是 unowned string 而不是 string。这将阻止 Vala 尝试释放它。

关于vala - Idris:如何从 Vala/C 调用 Idris 函数并将字符串返回给 C/Vala,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57810052/

相关文章:

scala - 在编译时添加两个相同大小的列表

glib - 几秒钟后 Vala 隐藏 Gtk.InfoBar

ubuntu - 在 pkg-config 搜索路径中找不到构建验证 : Package libvala-0. 12

vala - 无法创建 SinkInputInfo 数组

implicit - GADT 数据构造函数参数在 Idris 中如何工作?

haskell - 如何以类型编码可能的状态转换?

c - Vala 生成的 C 代码比手写的 C 代码优化了多少?

vala:这是以毫秒为单位获取当前时间的正确方法吗?

monads - 无法声明 MonadPlus 接口(interface)受 Monad 约束

coq - 如何在 Idris/Agda/Coq 中将类型映射到值?