[ID CS4-CS6] Странный баг

  • Автор темы Автор темы _MBK_
  • Дата начала Дата начала

_MBK_

Пикирующий бомбардировщик
Топикстартер
15 лет на форуме
Сообщения
33 700
Реакции
11 003
Полдня потерял и чуть не сломал себе мозг, пока не понял суть индусского бага.
Суть в следующем: надо заполнить (точнее, дописать в конец) один массив, элементами другого, уничтожив его при этом. Делаем это в цикле (не спрашивайте меня зачем):
JavaScript:
var hor=new Array;
for (var j=0;j<h.length;j++)
{
    hor.push(h.shift());
}
Вроде, все хорошо и работает правильно. Но не всегда. При определенном положении звезд результирующий массив заполняется не полностью, повторяемость бага зависит от загруженности индизайна информацией и количества произведенных до этого действий.
Причем, короткая конструкция данного действия hor=h.slice() работает, кажется, стабильно.
Может, я чего туплю? Баг присутствует вроде как на индизайнах разных версий.
 
Метод shift модифицирует исходный массив, который ты перебираешь. На что там внутри ссылается индекс массива - без полного кода непонятно.
Зачем городить вот такие сложности - тоже. Либо используй while с условием проверки массива на пустоту, либо оптимизируй нынешний код, но без модификации массива. Потом удалишь через delete.
 
Метод shift модифицирует исходный массив, который ты перебираешь.
Ну так мне это и надо - переместить элемент из одного массива в другой, мне показалось, что через shift это сделать самое логичное. Что я упустил?
 
Мутабельность массива упустил.
Ты внутри цикла выдергиваешь из массива нулевой элемент, остальные сдвигаются на минус один по индексу.
Меняется длина массива, меняется предел счётчика.
 
  • Спасибо
Реакции: jazzy
Меняется длина массива, меняется предел счётчика.
Т.е. ты хочешь сказать, что в цикле for нельзя использовать в условии остановки величины, меняющиеся внутри цикла? Как то не очень убедительно звучит, можно пруфы? 'hmmm'
 
нельзя использовать в условии остановки величины, меняющиеся внутри цикла? Как то не очень убедительно звучит, можно пруфы?
можно, но у тебя же до конца массива h перебор не дойдет, посередине из цикла выйдешь, j дойдет до половины исходного массива
 
  • Спасибо
Реакции: _MBK_
Да, похоже, вы правы, это я тупой 'cooll)'
Я поймался на то, что изначально условие остановки было по длине другого массива, я неподумамши поменял на этот, а потом мозг замылился в безуспешных поисках редко срабатывающего бага
 
Последнее редактирование:
ну можно в цикле написать типа

for (var j=0, length=h.length;j<length;j++)
 
Да нет все ясно, действительно надо было while ставить. Баг срабатывал чертовски редко потому что на небольших значениях в массиве был 1-2 элемента, этим же объясняется странная зависимость от общего количества ;)