Почему Array из GLib не работает с int в Vala? - PullRequest
1 голос
/ 15 марта 2019

Это пример 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 ]

2 голосов
/ 15 марта 2019

Базовая реализация обобщений Vala основана на указателе языка Си. int является типом значения, а не ссылочным типом, и не вписывается в текущую реализацию в Vala. Одно из решений состоит в том, чтобы превратить int в ссылочный тип с помощью «бокса». Это делает его обнуляемым: int?. Так что это работает:

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

   return 0;
}

В настоящее время ведется работа по созданию компилятора Vala для размещения простых обобщений, в которых используются типы значений. См. Запрос на слияние Vala # 52 .

В случае GArray, g_array_append_val() является макросом, и в документации указывается, что значение должно быть ссылкой на значение.

1 голос
/ 15 марта 2019

Попробуйте сначала назначить целые числа промежуточной переменной. Тот факт, что Vala не делает этого автоматически, является ошибкой Vala, о которой вы должны сообщить в восходящем потоке .

0 голосов
/ 15 марта 2019

Временный ответ для версии 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;
 }
...