我有这个玩具 project:
对于UI,我使用编译为C的Vala代码。因此,我可以在来自Idris的UI中显示一条消息。
在Idris ans 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():无效的指针
和
munmap_chunk():无效的指针
答案 0 :(得分:2)
Vala具有所有权转移的概念。当一个函数返回一个字符串时,Vala假定一旦完成使用它就负责释放它。 Idris FFI看起来像是在VM内分配所有数据并永远对其进行管理。
您可能需要告诉Vala返回类型为unowned string
而不是string
。这将阻止Vala尝试释放它。