为什么GLib中的Array不能与Vala中的int一起使用?

时间:2019-03-15 14:58:04

标签: arrays glib vala

这是https://valadoc.org/glib-2.0/GLib.Array.html的示例,但不是整数int会引发C错误。

int main(){
   Array<int> array = new Array<int> ();
   array.append_val (3);
   array.append_val (4);

    return 0;
}

错误:

In file included from/usr/include/glib-2.0 / glib.h: 31.,
                 from/tmp / algorithm2.vala.JWAGYZ.c: 4:
/ tmp / algorithm2.vala.JWAGYZ.c: in the function " _vala_main»:
/usr/include/glib-2.0/glib / garray.h: 64:59: error: unary operation operand ' & ' must be an lvalue expression
   64 | #define g_array_append_val(a, v) g_array_append_vals (a, &(v), 1)
      / ^
/ tmp / algorithm2.vala.JWAGYZ.c: 53:2: note: in the macro extension "g_array_append_val»
   53 | g_array_append_val (array, 3);
      | ^~~~~~~~~~~~~~~~~~
/usr/include/glib-2.0/glib / garray.h: 64:59: error: unary operation operand ' & ' must be an lvalue expression
   64 | #define g_array_append_val(a, v) g_array_append_vals (a, &(v), 1)
      / ^
/ tmp / algorithm2.vala.JWAGYZ.c: 54:2: note: in the macro extension "g_array_append_val»
   54 / g_array_append_val (array, 4);
      | ^~~~~~~~~~~~~~~~~~
error: cc exited with status 256

3 个答案:

答案 0 :(得分:2)

Vala泛型的基础实现基于C指针。 int是一个值类型,而不是引用类型,并且与Vala中的当前实现不太匹配。一种解决方案是通过“装箱”将int变成参考类型。这基本上是使其成为可空类型:int?。如此有效:

int main(){
   Array<int?> array = new Array<int?> ();
   array.append_val (3);
   array.append_val (4);

   return 0;
}

当前正在进行一些工作来使Vala编译器适应使用值类型的简单泛型。参见Vala merge request #52

对于GArray,g_array_append_val()是宏,文档建议该值必须是对该值的引用。

答案 1 :(得分:1)

首先尝试将整数分配给中间变量。 Vala不会自动执行此操作的事实是Vala错误,您应该report upstream

答案 2 :(得分:0)

Vala 0.44版本的临时答案,直到您纠正错误为止:

int main(){
    Array<int> array = new Array<int> ();
    int a = 3, b = 4;
    array.append_val (a);
    array.append_val (b);

    for (int i = 0; i < array.length ; i++) {
        print ("%d\n", array.index (i));
    }

     return 0;
 }