Ого как! Спасибо, Андрэ, спасибо тебе большое за донат и поддержку КК! вот что напиал мсье Андрэ:
от Норкмана за real_time и прочее, спс
А я напоминаю, что поддержать КК можно, перейдя на его страничку и направив ему немного денег.
Ок, пожалуй, скажу вам, КК сейчас работает над очередным расширением, довольно полезным. Ну и хватит об этом, вернёмся к уроку
Итак, произошло кое-что прекрасное... произошли изменения в том, как арма работает с массивами. Сейчас мы ждём официального подтверждения того, что массивы получили свою порцию суровой БИСовской мужской любви от БИСовских же программистов. Сейчас КК проводит ревизию прошлых уроков по архивам и проверяет всё на Арме Второй, чтобы удостовериться, что ошибок не было. И вышло так, что первые три части уроков по массивам до сих пор вполне себе пригодны для Армы второй. А вот в ДЕВке Армы Третьей уже новая работа с массивами, держим кулачки за то, чтобы это перенесли в основную ветку.
Изменения коснулись команд in, find и -. Вкратце, сейчас эти команды работают с многомерными массивами. Позвольте продемонстрировать на примерах:
1 in [1,[2,[3]],[[[4]]]]
//Arma 2 => true
//Arma 3 => true
[2,[3]] in [1,[2,[3]],[[[4]]]]
//Arma 2 => false
//Arma 3 => true
[[[4]]] in [1,[2,[3]],[[[4]]]]
//Arma 2 => false
//Arma 3 => true
Вот видите, команда in теперь будет обращаться с массивом внутри массива так же, как с любым другим элементом базового массива. Базовый массив [элемент1, элемент2, элемент3...], в нём любой элемент может быть ещё одной структурой мссива, например: [1,[2,[3],4]]. Это же справедливо и для команды find:
[1,[2,[3]],[[[4]]]] find 1
//Arma 2 => 0
//Arma 3 => 0
[1,[2,[3]],[[[4]]]] find [2,[3]]
//Arma 2 => -1
//Arma 3 => 1
[1,[2,[3]],[[[4]]]] find [[[4]]]
//Arma 2 => -1
//Arma 3 => 2
Но наилучшее улучшение на мой взгляд состоит в том, что теперь вы можете удалять элементы из многомерных массивов гораздо легче, чем прежде:
[1,[2,[3]],[[[4]]]] - [1]
//Arma 2 => [[2,[3]],[[[4]]]]
//Arma 3 => [[2,[3]],[[[4]]]]
[1,[2,[3]],[[[4]]]] - [[2,[3]]]
//Arma 2 => [1,[2,[3]],[[[4]]]]
//Arma 3 => [1,[[[4]]]]
[1,[2,[3]],[[[4]]]] - [[[[4]]]]
//Arma 2 => [1,[2,[3]],[[[4]]]]
//Arma 3 => [1,[2,[3]]]
Обратите внимание: чтобы удалить элемент вам надо определить его "от базового массива": [[[[4]]]] в примере выше, не 4, не [4], [[4]] или [[[4]]]. И, поскольку пост получается маленьким, мы украсим его вишенкой из варианта функции arrayShuffle от КК:
KK_fnc_arrayShuffle = {
private ["_cnt","_el1","_rnd","_indx","_el2"];
_cnt = count _this - 1;
_el1 = _this select _cnt;
_this resize _cnt;
_rnd = random diag_tickTime * _cnt;
for "_i" from 0 to _cnt do {
_indx = floor random _rnd % _cnt;
_el2 = _this select _indx;
_this set [_indx, _el1];
_el1 = _el2;
};
_this set [_cnt, _el1];
_this
};
KK_fnc_arrayShuffle почти в 4 раза быстрее, чем BIS_fnc_arrayShuffle и это если сравнивать массивы из всего-то 10 элементов. Кстати, она ещё и изменяет оригинальный массив, как PHPшная shuffle(). А ещё, эта функция возвращает массив, то есть, действует аналогично БИСовской функции. Использование:
_arr = [0,1,2,3,4,5,6,7,8,9];
// метод 1
_arr call KK_fnc_arrayShuffle;
hint str _arr;
// метод 2
hint str (_arr call KK_fnc_arrayShuffle);
И почему бы не улучшить эту функцию ещё сильнее? Добавим к ней параметр, позволяющий регулировать "силу" перемешивания? Благодаря тому, как работает KK_fnc_arrayShuffle, довольно просто расширить её функционал:
KK_fnc_arrayShufflePlus = {
private ["_arr","_cnt","_el1","_rnd","_indx","_el2"];
_arr = _this select 0;
_cnt = count _arr - 1;
_el1 = _arr select _cnt;
_arr resize _cnt;
_rnd = random diag_tickTime * _cnt;
for "_i" from 1 to (_this select 1) do {
_indx = floor random _rnd % _cnt;
_el2 = _arr select _indx;
_arr set [_indx, _el1];
_el1 = _el2;
};
_arr set [_cnt, _el1];
_arr
};
Дефолтное число итераций перемешивания по-дефолту равно длине массива, в БИСовской функции точно так же. С помощью функции KK_fnc_arrayShufflePlus вы можете усиливать или ослаблять перемешивание по вашему желанию, указывая второй аргумент с желаемым числом итераций. Использование:
_arr = [0,1,2,3,4,5,6,7,8,9];
// метод 1 с дефолтным числом итераций
[_arr, count _arr] call KK_fnc_arrayShufflePlus;
hint str _arr;
// метод 2 с хорошим перемешиванием
hint str ([_arr, 100] call KK_fnc_arrayShufflePlus);
Пользуйтесь наздоровье!