我有这个玩具 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/