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

_MBK_

Пикирующий бомбардировщик
Топикстартер
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Полдня потерял и чуть не сломал себе мозг, пока не понял суть индусского бага.
Суть в следующем: надо заполнить (точнее, дописать в конец) один массив, элементами другого, уничтожив его при этом. Делаем это в цикле (не спрашивайте меня зачем):
JavaScript:
var hor=new Array;
for (var j=0;j<h.length;j++)
{
    hor.push(h.shift());
}
Вроде, все хорошо и работает правильно. Но не всегда. При определенном положении звезд результирующий массив заполняется не полностью, повторяемость бага зависит от загруженности индизайна информацией и количества произведенных до этого действий.
Причем, короткая конструкция данного действия hor=h.slice() работает, кажется, стабильно.
Может, я чего туплю? Баг присутствует вроде как на индизайнах разных версий.
 

Oleg Butrin

20 лет на форуме
Сообщения
1 989
Реакции
1 213
Метод shift модифицирует исходный массив, который ты перебираешь. На что там внутри ссылается индекс массива - без полного кода непонятно.
Зачем городить вот такие сложности - тоже. Либо используй while с условием проверки массива на пустоту, либо оптимизируй нынешний код, но без модификации массива. Потом удалишь через delete.
 

_MBK_

Пикирующий бомбардировщик
Топикстартер
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Метод shift модифицирует исходный массив, который ты перебираешь.
Ну так мне это и надо - переместить элемент из одного массива в другой, мне показалось, что через shift это сделать самое логичное. Что я упустил?
 

Oleg Butrin

20 лет на форуме
Сообщения
1 989
Реакции
1 213
Мутабельность массива упустил.
Ты внутри цикла выдергиваешь из массива нулевой элемент, остальные сдвигаются на минус один по индексу.
Меняется длина массива, меняется предел счётчика.
 
  • Спасибо
Реакции: jazzy

_MBK_

Пикирующий бомбардировщик
Топикстартер
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Меняется длина массива, меняется предел счётчика.
Т.е. ты хочешь сказать, что в цикле for нельзя использовать в условии остановки величины, меняющиеся внутри цикла? Как то не очень убедительно звучит, можно пруфы? 'hmmm'
 

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
нельзя использовать в условии остановки величины, меняющиеся внутри цикла? Как то не очень убедительно звучит, можно пруфы?
можно, но у тебя же до конца массива h перебор не дойдет, посередине из цикла выйдешь, j дойдет до половины исходного массива
 
  • Спасибо
Реакции: _MBK_

_MBK_

Пикирующий бомбардировщик
Топикстартер
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Да, похоже, вы правы, это я тупой 'cooll)'
Я поймался на то, что изначально условие остановки было по длине другого массива, я неподумамши поменял на этот, а потом мозг замылился в безуспешных поисках редко срабатывающего бага
 
Последнее редактирование:

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
ну можно в цикле написать типа

for (var j=0, length=h.length;j<length;j++)
 

_MBK_

Пикирующий бомбардировщик
Топикстартер
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Да нет все ясно, действительно надо было while ставить. Баг срабатывал чертовски редко потому что на небольших значениях в массиве был 1-2 элемента, этим же объясняется странная зависимость от общего количества ;)