Дело в том, что операция присваивания (=) не копирует массив, как это делает с любыми другими типами данных, а лишь присваивает переменной ссылку на массив, чтобы не создавать в памяти одни и те же данные по многу раз, ведь массив может быть очень большой структурой имеющий члены с глубокой вложенностью, с другими ссылками на массив, все это копировать очень затратно и не почти никогда не нужно программисту. А вот сложение и вычитание массивов создает новые массивы. Объясняю, что происходит в коде автора темы:
// Получаем ссылку на массив из профиля и кладем ее в локальную переменную
_myVar1 = profileNamespace getVariable "MyVar1";
// Вызываем команду складывания массивов, которая создает **новый** массив из того, что по ссылке в _myVar1 и нового массива [4]
_myVar1 = _myVar1 + [4];
// Вызываем команду вычитания массивов, которая создает **новый** массив из того, что по ссылке в _myVar1 и нового массива [4]
_myVar1 = _myVar1 - [4];
// Вызываем команду установки элемента в массиве
_myVar1 set [1,0];
Таким образом код два раза создает новый массив и потом делает set [1,0] в уже другом массиве, а не том, что лежит в profileNamespace.
Вывод: Команды <array> + <array> и <array> - <array> создают новый, а не изменяют старый!
Вопрос: Как изменять массив, не копируя его при каждой операции или один раз получив массив откуда-то, оперировать только им, а не его копиями.
Ответ: В Arma 3 появились удобные команды позволяющие проводить похожие операции, изменяющие оригинальный массив, а не создающие копию. Эти команды:
Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание
Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание
Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание
Код автора с новыми командами и ожидаемым результатом:
profileNamespace setVariable ["MyVar1",[1,2,3]];
_myVar1 = profileNamespace getVariable "MyVar1";
_myVar1 pushBack 4;
_myVar1 deleteAt (_myVar1 find 4);
_myVar1 set [1,0];
hint str (profileNamespace getVariable "MyVar1"); // [1,0,3]
---
p.s. profileNamespace добавили не только в А3, а есть он еще и в А2ОА, правда с багом на выделенном сервере, где сохраненные данные не грузятся, т.е. работает только для игроков.
Сообщение отредактировал Sa-Matra: 04 May 2015 - 15:41