Перейти к содержимому

DustBlue IPB Skin by CodeGame Networks

Массивы и циклы, доступ к массиву, перебор массива, удаление элементов массива

dayz epoch array arrays for forEach

  • Закрытая тема Тема закрыта
В этой теме нет ответов

#1 NoNameUltima

NoNameUltima

    Администратор

  • Администраторы
  • 191 сообщений
  • ГородСанкт-Петербург

Отправлено 05 марта 2015 - 14:52

Массивы и циклы.

В. В чем различие цикла forEach от цикла for
О. Цикл forEach создает копию массива в памяти, и служит для быстрого поиска в массиве заданного элемента.
При этом любые изменения самого массива, внутри цикла forEach, ни как на нем не отразятся.
т.е. - Если Вам необходимо, что то найти в массиве, не затрагивая при этом сам массив(не меняя его элементы), то цикл forEach, прекрасно для этого подходит.
Если Вам необходимо менять по ходу цикла значения элементов массива, то используйте цикл for.

В. В чем отличие цикла
 for "_i" from 0 to _xxx do 
от цикла
 for "_i" from _xxx to 0 step -1 do

О. Цикл:
 for "_i" from 0 to _xxx do
Перебирает массив, и Вы можете менять элементы массива, но если Вам необходимо, внутри цикла удалять элементы массива, Вам необходим обратный цикл:
 for "_i" from _xxx to 0 step -1 do

Пример некорректного использования цикла:
 for "_i" from 0 to _xxx do

Предположим у вас есть массив:
_xxx = [0,2,9,0,2];
Как видим, в нем 4 элемента(счет идет с нуля).
Ваша задача, удалить элементы больше 1.
Неправильный цикл:
for "_i" from 0 to count _xxx do // Цикл от нуля и до 4(кол-во элементов массива)
{
if ( (_xxx select _i) > 1 ) then // Если текущий элемент больше 1 -
{
_xxx set [_i, -1]; // Заменить текущий элемент массива на -1
_xxx = _xxx - [-1]; // Удалить в массиве элемент [-1]
};
};
  • При нулевой итерации цикла, будет взято число из массива = 0.
  • Число больше 1 - Цикл переходит на следующую итерацию.
  • Первая итерация - число будет = 2.
  • Число больше 1 -
  • Данный элемент будет удален.
  • Следующая итерация возьмет число 0!!!
В. Почему 0, почему не 9?
О. После удаления элемента массива, его счетчик так же будет изменен, в следствии этого, т.к. элемента 1 равного 2, более не существует, его заменит элемент 2 равный 9.
И тут сразу 2 ошибки:
  • Мы пропустили элемент который должен был быть удален.

  • Цикл идет до 4 элементов, а у нас на втором шаге их уже стало 3, т.е. - вы получите ошибку скрипта, при доступе к несуществующему элементу списка.
Правильный цикл:
for "_i" from (count _xxx) to 0 step -1 do // Цикл от 4(кол-во элементов массива) до 0
{
if ( (_xxx select _i) > 1 ) then // Если текущий элемент больше 1 -
{
_xxx set [_i, -1]; // Заменить текущий элемент массива на -1
_xxx = _xxx - [-1]; // Удалить в массиве элемент [-1]
};
};






Темы с аналогичным тегами dayz, epoch, array, arrays, for, forEach

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных