Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: для новичков > Не получается 2-мерный массив.


Автор: kuksha 8.1.2012, 17:15
Пытаюсь сделать 2-мерный массив 650x650 в виде глобального, чтобы потом вызывать из функций.
Сделал это так, на большее знаний не хватило:
Код

...
 var Dot_data = new Array(650);
 for (i=0; i<650; ++i) { Dot_data[i]=new Array(650);}
...
function a()
{
 ...
 Dot_data[X-1][Y-1]=zv_n[i]; //сбойная строка
}

Собственно указана сбойная строка, на которой скрипт "вылетает". (вместо zv_n[i] я пробовал подставлять и строки и числа - всё равно сбоит)
Наверное лучше посмотреть это вживую в файле: http://info-7.ru/Astro/draw_map5.js строка №171.
При этом строка №903 
Код

msg.document.write(Dot_data[Xi-1][Yi-1]);

отрабатывает нормально.
Что я не так делаю?

Автор: kuksha 8.1.2012, 21:17
Может просто for не отрабатывает так как это прописано? 
Ведь из PHP-файла вызываются конкретные функции из этого js-файла, а заполнение второго измерения этого массива идёт через for вне функций, который то ли отрабатывает то ли нет. С другой стороны - ведь глобальные переменные подцепляются нормально, а некоторые и вычисляются...
Не знаю в какую сторону ещё думать...
Может есть другие способы задания такого массива?

Автор: Amphiluke 8.1.2012, 21:46
kuksha, вам сложно помочь, не видя, что за ошибка. Что пишется в консоль конкретно? Файл вашего скрипта мало чем может помочь в выяснении обстоятельств ошибки. Гораздо легче было бы, если бы вы дали ссылку на страницу, где проявляется баг.

Автор: kuksha 8.1.2012, 22:00
Вот сама страница, с которой вызывается этот файл:
http://info-7.ru/Astro/nebo_segodnya_geo5.php?zero=1
на ней рисуются линии созвездий, а дальше должны рисоваться звёзды, но их нет - из этого цикла мы и вылетаем...
А вот для сравнения:
http://info-7.ru/Astro/nebo_segodnya_geo.php?zero=1

Автор: Amphiluke 8.1.2012, 22:18
Цитата(kuksha @  8.1.2012,  21:15 Найти цитируемый пост)
Код

Dot_data[X-1][Y-1]=zv_n[i]; //сбойная строка


Методом простой трассировки скрипта выясняется, что переменные X и Y могут принимать совершенно произвольные значения: как отрицательные, так и бОльшие, чем размерность массива Dot_data. Следовательно, причина в неправильных индексах.

Автор: kuksha 8.1.2012, 22:22
АЙ!!!!!
точно... это же координаты...
Очередное спасибо!

Amphiluke, а чем Вы пользуетесь для отладки? Может у меня бы вопросов поменьше стало...

Автор: Amphiluke 8.1.2012, 22:22
Кстати (простите), я надеюсь, это черновая версия скрипта? smile  Некоторые программы на ассемблере читать проще.

Добавлено через 30 секунд
Цитата(kuksha @  9.1.2012,  02:22 Найти цитируемый пост)
а чем Вы пользуетесь для отладки?

Firebug`ом.

Автор: kuksha 8.1.2012, 22:31
Там много чего "оставленного на потом", начиная с var в каждой строчке... 
Я же JS по-большому счёту почти не знаю - это первое что на нём пишу...

Автор: Amphiluke 8.1.2012, 22:46
Кстати (не по теме). Когда пишете документ в новом окне методом document.write, не забывайте закрывать поток вывода методом document.close(). В отличие от document.open(), вызов этого метода обязателен…
Код

msg=window.open("","msg","height=200,width=200,left=500,top=10");
msg.document.write("<html><title>Image</title><body>");
msg.document.write(Dot_data[Xi-1][Yi-1]);
msg.document.write("</body></html>");
msg.document.close();

Автор: kuksha 8.1.2012, 23:09
Ага, учту smile

Автор: kuksha 10.1.2012, 19:07
Вот такой вопрос образовался:
А как быстрее всего упомянутый в первом сообщении глобальный двумерный массив Dot_data "опустошить" по ходу работы? То есть не залить нулями в цикле, а так чтобы он просто был пустым (null). (по ходу работы заполняются только некоторые его ячейки, остальные должны остаться null)
Двойным циклом как-то некрасиво делать, а сделать его заново (когда он весь null) внутри функций наверное помешает его глобальность.

Автор: Amphiluke 11.1.2012, 18:04
Пустой массив и null — не одно и то же. Определитесь, что вам конкретно нужно. Если вы хотите дать понять сборщику мусора, что данные массива более не потребуются, и память, выделенная под массив, может быть освобождена, просто обнулите ссылку.
Код

Dot_data = null;

Если же вам нужно именно «опустошить» массив, можно воспользоваться тем, что свойство length объектов Array доступно для записи.
Код

Dot_data.length = 0;

Цитата(kuksha @  10.1.2012,  23:07 Найти цитируемый пост)
Двойным циклом как-то некрасиво делать, а сделать его заново (когда он весь null) внутри функций наверное помешает его глобальность.

Почему это глобальность помешает? Напротив, она делает массив доступным из любой точки программы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)