2015-07-11 4 views
1
[indent=4] 

init 
    x: array of int = {1, 2, 3} 
    y: array of int = {4, 5, 6} 
    z: array of int = x + y 

Приведенный выше код выдает сообщение об ошибке:Как объединить два массива?

concat_arrays.gs:6.23-6.27: error: Incompatible operand 
    z: array of int = x + y 

перевод Вала не работает лучше:

int main() { 
    int[] x = {1, 2, 3}; 
    int[] y = {4, 5, 6}; 
    int[] z = x + y; 
    return 0; 
} 

Сообщение об ошибке:

concat_arrays_v.vala:4.15-4.19: error: Incompatible operand 
    int[] z = x + y; 

Что это правильный способ сделать это?

ответ

0

Использование GLib.Array<T>:

int main() { 
    int[] x = {1, 2, 3}; 
    int[] y = {4, 5, 6}; 
    Array<int> a = new Array<int> (false, true, 0); 
    a.append_vals (x, x.length); 
    a.append_vals (y, y.length); 
    // taking over ownership avoids array copying 
    int[] z = (owned) a.data; 

    foreach (var i in z) { 
     stdout.printf ("%d ", i); 
    } 
    stdout.printf ("\n"); 

    return 0; 
} 

версия Genie:

[indent=4] 

init 
    x: array of int = {1, 2, 3} 
    y: array of int = {4, 5, 6} 
    var a = new Array of int (false, true, 0) 
    a.append_vals (x, x.length) 
    a.append_vals (y, y.length) 
    z: array of int = (owned) a.data 

Обновление: После answering this question Я изменил приведенный выше код, чтобы использовать (owned), который позволяет избежать операции копирования незавершенного массива.

new Array<T> все еще добавляет некоторые накладные расходы для выделения объекта, но в большинстве случаев это не должно быть проблемой.

Использование Memory.copy опасно, так как это может вызвать проблемы со всеми видами памяти.

1

Используйте эту функцию

int[] array_concat(int[]a,int[]b){ 
    int[] c = new int[a.length + b.length]; 
    Memory.copy(c, a, a.length * sizeof(int)); 
    Memory.copy(&c[a.length], b, b.length * sizeof(int)); 
    return c; 
} 

Взято из: http://rosettacode.org/wiki/Array_concatenation#Vala

+0

Это так, но на самом деле вы должны указывать код там, потому что ссылки только для ссылок скорее всего станут недействительными в будущем. –

+0

Вы уверены, что @ JensMühlenhoff. Я буду держать это в виду в следующий раз. –

+0

В чем разница между ** и c [a.length] ** и ** c + a.length ** –

Смежные вопросы