Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Где ошибка кода? (https://javascript.ru/forum/events/36536-gde-oshibka-koda.html)

MininAS 19.03.2013 00:49

Где ошибка кода?
 
Стою на асфальте я в лыжи обутый, то ли лыжи не едут, то ли я ......

Что с кодом:
for (ii=0; ii<=YyY; ii++)
{
	for (i=0; i<=XxX; i++)
	{
                iii = i*ii+i;
		a_gameDB[iii] = Math.ceil (Math.random ()*((XxX*YyY-(iii))/10+4));
	           s_gameDB += a_gameDB[iii]+'/';
		document.getElementById('screen_right').innerHTML += a_gameDB[iii]+'-';
	}
}
document.getElementById('screen_right').innerHTML +='<br>' + s_gameDB + '<br> ';
for (i=0; i<=XxX*YyY; i++)
{
	document.getElementById('screen_right').innerHTML += a_gameDB[i]+'-';
}

Первый цикл в цикле создает массив a_gameDB из чисел и строку s_gameDB из тех же чисел, а во втором цикле опять перебирая массив программа выдает совершенно другие числа. Уже второй час туплю не понимаю в чем дело? :(

zilker 19.03.2013 01:21

Потому что
a_gameDB[i*ii+i] =
бред. Вы уверены, что на каждой итерации итератор будет ровно на единицу больше предыдущего? Для этого у массивов существует метод push. Ну и еще немного:
- ii и i у вас объявлены до циклов? Если нет, захламляете глобал, используйте for (var i = 0;...
- не используйте одинаковые названия итераторов для циклов (у вас 2 цикла с i = 0), тоже может вызвать проблему
- не используйте "XxX*YyY" в условии цикла, иначе умножение будет выполнятся на каждой итерации
- не используйте document.getElementById('screen_right') в цикле, создайте переменную до цикла
var screen_right = document.getElementById('screen_right');
, а в цикле используйте ее: screen_right.innerHTML

danik.js 19.03.2013 06:49

Цитата:

Сообщение от zilker
, а в цикле используйте ее: screen_right.innerHTML

Даже больше: аккумулируйте html в строку-буфер, а уже после цикла присваивайте ее значение в innerHTML - скорость возрастет в разы.

MininAS 19.03.2013 10:27

Цитата:

Сообщение от zilker (Сообщение 241439)
Потому что
a_gameDB[i*ii+i] =
бред.
1. Вы уверены, что на каждой итерации итератор будет ровно на единицу больше предыдущего? Для этого у массивов существует метод push.
Ну и еще немного:
2. - ii и i у вас объявлены до циклов? Если нет, захламляете глобал, используйте for (var i = 0;...
3. - не используйте одинаковые названия итераторов для циклов (у вас 2 цикла с i = 0), тоже может вызвать проблему
4. - не используйте "XxX*YyY" в условии цикла, иначе умножение будет выполнятся на каждой итерации
5. - не используйте document.getElementById('screen_right') в цикле, создайте переменную до цикла
var screen_right = document.getElementById('screen_right');
, а в цикле используйте ее: screen_right.innerHTML
Даже больше: аккумулируйте html в строку-буфер, а уже после цикла присваивайте ее значение в innerHTML - скорость возрастет в разы.

1. Ранее такое у меня сомнений не вызывало как и сейчас, и вообще я делал и по другому qwe = i*ii+i и вставлял qwe вместо i*ii+i. И push перебирал.
2. Почему я захламляю глобал если они постоянно используются у меня в множестве циклов по всему коду.
3. Каким образом?
4. согласен.
5. А вот про это стоп, я использую это просто, чтобы просмотреть что творится с циклом, этого момента в коде не будет.

danik.js 19.03.2013 11:06

Цитата:

Сообщение от MininAS
2. Почему я захламляю глобал если они постоянно используются у меня в множестве циклов по всему коду.

Глобальную переменную неудобно отслеживать в отладчике. Да и зачем делать ее глобальной если она должна быть локальной?
3. Да ничего ничему не будет мешать, если циклы не вложенные.

zilker 19.03.2013 13:51

Цитата:

Сообщение от danik.js (Сообщение 241447)
Даже больше: аккумулируйте html в строку-буфер, а уже после цикла присваивайте ее значение в innerHTML - скорость возрастет в разы.

да, ночью не додумал

Цитата:

3. Каким образом?
да, могут возникнуть проблемы с вложенными циклами. Просто я вижу в 5й строке вашего кода переменную iii, что наталкивает на мысль, что приведенный вами код исполняется ещё в каком-то цикле с итератором iii. C таким подходом и кол-вом циклов есть вероятность ошибки.

MininAS 19.03.2013 14:29

Цитата:

Сообщение от zilker (Сообщение 241486)
Просто я вижу в 5й строке вашего кода переменную iii, что наталкивает на мысль, что приведенный вами код исполняется ещё в каком-то цикле с итератором iii. C таким подходом и кол-вом циклов есть вероятность ошибки.

Извиняюсь это моя ошибка, там так же должно стоять i*ii+i. (исправил)

Но все же в чем ошибка?

MininAS 20.03.2013 09:38

ААААААААААААААААААААААААА , лыжи едут!
Не i*ii+i, а XxX*ii+i.


Часовой пояс GMT +3, время: 07:47.