PDA

Просмотр полной версии : Проблемы с масивом


intro
08.11.2005, 18:06
У меня возникла проблема с массивом...
//Заполнение массива данными из XML файла
var my_xml:XML = new XML();
var xml_array:Array = new Array();
var i:Number;
var j:Number;
my_xml.ignoreWhite = true;
//my_xml.load("c:/XML/xml2.xml");
my_xml.load("http://localhost/xml2.php");
my_xml.onLoad = function() {
for (j=1; j<4; j++) {
for (i=1; i<4; i++) {
xml_array[j, i] = {id:my_xml.childNodes[0].childNodes[j-1].childNodes[i-1].childNodes[0].nodeValue};
//trace(my_xml.childNodes[0].childNodes[j].childNodes[i].childNodes[0].nodeValue);
trace(xml_array[j, i].id);
}
}
}
//Отображение фигуры в зависимости от значения в массиве
if (xml_array[1, 1].id == 0) {
my_color = new Color(this.podstan_1);
my_color.setRGB(0xFF0000);
} else {
my_color = new Color(this.podstan_1);
my_color.setRGB(0x00FF99);
}
trace (xml_array[1,2].id);

Так вот после выхода из функции onLoad, массива не существует... Надо ли массив объявлять как глобальный? Если да, то как?

wwwita
08.11.2005, 18:14
сделай его в руте и заполняй его из onLoad как
_root.xml_array[j, i]

все переменные, что заданы в корне кадра (не в каком нибудь мувике) - считаются глобальными.
глобальные переменные существуют в течении одного кадра, если хочешь чтобы они были везде - растяни кадр на столько на сколько тебе нужно. * так было в flash mx, может в 7-ке и 8-ке что-нибудь могло измениться.

wwwita
08.11.2005, 18:16
да, изменилось... в 8-ке если один раз задать в корне переменную она видна из любого кадра :)

iNils
08.11.2005, 18:23
все переменные, что заданы в корне кадра (не в каком нибудь мувике) - считаются глобальными.
они считаеются рутовыми, а не глобальными

глобальные переменные существуют в течении одного кадра, если хочешь чтобы они были везде - растяни кадр на столько на сколько тебе нужно. * так было в flash mx, может в 7-ке и 8-ке что-нибудь могло измениться.
они существуют в любом кадре и не надо ничего растягивать, создаются они через _global

wwwita
08.11.2005, 18:29
Чувак, факт есть факт, а у кого какие понятия - зависит от распальцовки ;)

iNils
08.11.2005, 18:31
Чувак, факт есть факт, а у кого какие понятия - зависит от распальцовки ;)
Далеко ты с такими знаниями пойдешь :)

wwwita
08.11.2005, 18:36
уже ушел.. не догонишь

7thsky™
08.11.2005, 18:46
iNils - а ты посмотри массив то какой крутой :)


trace(xml_array[j, i].id);


почитать по теме (http://novemberain.com/livedocs/Help/ActionScriptLangRef/00001150.html)

iNils
08.11.2005, 18:52
iNils - а ты посмотри массив то какой крутой :)


trace(xml_array[j, i].id);


почитать по теме (http://novemberain.com/livedocs/Help/ActionScriptLangRef/00001150.html)
А слона то я и не приметил :)
обращение к двухмерному массиву осуществляется так
xml_array[j][i]

intro
08.11.2005, 19:01
Странно, но почему-то у меня на заполнение массива такого формата xml_array[j][i] выдает ошибку, а вот формат xml_array[j, i] работает нормально без всяких проблем. И заполняется и выводится.
Плиз... Прошу... Ответьте конкретней, что мне надо сделать, что бы массив читалься вне функции? Заранее благодарен.

iNils
08.11.2005, 19:07
xml_array = [];
xml_array[2, 1] = 5;
xml_array[1] = 6;
trace (xml_array[2, 1]);
trace (xml_array[1]);
trace (xml_array[2]);
//////////
trace ("--------------")
//////////
xml_array = [];
xml_array[2] = [];
xml_array[2][0] = 4;
xml_array[2][1] = 5;
trace (xml_array[2]);
trace (xml_array[2][1]);

7thsky™
08.11.2005, 19:08
:) приколист

iNils
08.11.2005, 19:08
Ответьте конкретней, что мне надо сделать, что бы массив читалься вне функции? Заранее благодарен.

_global.xml_array = []

и все...

iNils
08.11.2005, 19:12
И еще про двухмерные массивы:
если тебе надо создать xml_array[i][j]
то после задания xml_array как массива
xml_array = []
нужно элемент xml_array[i] тоже сделать массивом
xml_array[i] = []

ну а трехмерный соответственно так
xml_array[i][j] = []
и будет xml_array[i][j][k] = "что то тут"

7thsky™
08.11.2005, 19:14
во флэше нету многомерных массивов, есть массивы ОДНОМЕРНЫЕ, многомерные эмулируются же таким образом, что элемент массива, сам является массивом

то бишь

var a:Array = new Array ();

for (var i:Number = 0; i < 10; i++) {
a [i] = new Array ();
for (var j:Number = 0; j < 10; j++) {
a [i] [j] = 'test_' + i + '_' + j;

trace ('>> a [ ' + i + ', ' + j +' ] > ' + a [i] [j]);
} // end for
} // end for

K.A.T.A.F.A.L.K.E.R
08.11.2005, 19:51
var my_xml:XML = new XML();
var xml_array:Array = new Array();
my_xml.ignoreWhite = true;
my_xml.load("http://localhost/xml2.php");
my_xml.onLoad = function(){
for (j=1; j<4; j++){
xml_array[j] = new Array();
for (i=1; i<4; i++) {
xml_array[j][i] = {id:my_xml.childNodes[0].childNodes[j-1].childNodes[i-1].childNodes[0].nodeValue};
trace(xml_array[j][i].id);
}
}
}
if (xml_array[1][1].id == 0) {
my_color = new Color(this.podstan_1);
my_color.setRGB(0xFF0000);
} else {
my_color = new Color(this.podstan_1);
my_color.setRGB(0x00FF99);
}
trace(xml_array[1][2].id);

Как там с обработкой ХМЛ-я не знаю, но с массивом, по идее, нужно так...

K.A.T.A.F.A.L.K.E.R
08.11.2005, 19:55
ААААА!!! Сорри за повторение уже сказанного - не заметил вторую страницу :D

intro
09.11.2005, 12:57
Объявить глобальную так можно?

_global.xml_array:Array = new Array();

У меня синтаксическая ошибка...

iNils
09.11.2005, 13:02
нет, строгая типизация для _global не работает

надо так
_global.xml_array = new Array();

unlexx
09.11.2005, 13:02
тебе же ЭкшенСкриптовским языком написали!!! Используй абсолютную адресацию (_root _level0 _global)
и вообще зачем делать массив из xml-ки?
можно же сразу брать значения из нод.

7thsky™
09.11.2005, 13:04
правильно что ошибка, сам посмотри что ты написал?! ты объявляешь переменную у объекта _global, при этом указываешь тип переменной, при этом не пишешь var :) короче напиши просто

_global.xml_array = new Array ();

iNils
09.11.2005, 13:06
ты объявляешь переменную у объекта _global, при этом указываешь тип переменной, при этом не пишешь var :)

Я не думаю, что он такие тонкости поймет.

intro
09.11.2005, 13:08
Зачем по сто раз обращатся в XML, если один раз заполнил массив и с ним можно работать постоянно. Таа..а..к щаз попробуем...

intro
09.11.2005, 13:09
Я не думаю, что он такие тонкости поймет.
прикалываетесь :(

iNils
09.11.2005, 13:11
прикалываетесь :(
когда прикалываюсь, я смайлик в конце ставлю.
если понял, то хорошо.

intro
09.11.2005, 13:23
Не палит....

_global.xml_array = new Array();
var my_xml:XML = new XML();
my_xml.ignoreWhite = true;
my_xml.load("http://localhost/xml2.php");
my_xml.onLoad = function() {
k=1;
for (j=1; j<3; j++) {
for (i=1; i<3; i++) {
xml_array[k] = {id:my_xml.childNodes[0].childNodes[j].childNodes[i].childNodes[0].nodeValue};
k++;
}
}
};
for (i=1; i<10; i++) {
trace(xml_array[i].id);
}

unlexx
09.11.2005, 13:34
Зачем по сто раз обращатся в XML, если один раз заполнил массив и с ним можно работать постоянно. Таа..а..к щаз попробуем...
ага и хранить два массива данных вместо одного.
а к масиву ты будешь обращяться столько же раз
и многомерные массивы имеют свойство тормозить
вобщем вырабатывай свой стиль

intro
09.11.2005, 13:41
Уже один массив... и тот не палит... :(
Помогите...please!

iNils
09.11.2005, 13:46
а так?
xml_array[k] = {id:this.childNodes[0].childNodes[j].childNodes[i].childNodes[0].nodeValue};

unlexx
09.11.2005, 13:51
дык если человек боиться xml? он ООП вообще испугаеться :)

intro
09.11.2005, 14:00
Массив то оно заполняет....ну именно в функции... а вне ф-ции не выводит...пишет андифинет. Такое ощущение что сначало выполняется вывод массива, а потом только ф-ция...

unlexx
09.11.2005, 14:08
_global.xml_array = new Array();
var my_xml:XML = new XML();
my_xml.ignoreWhite = true;
my_xml.load("http://localhost/xml2.php");
my_xml.onLoad = function() {
k=1;
for (j=1; j<3; j++) {
for (i=1; i<3; i++) {
_global.xml_array[k] = {id:my_xml.childNodes[0].childNodes[j].childNodes[i].childNodes[0].nodeValue};
k++;
}
}
};
for (i=1; i<10; i++) {
trace(_global.xml_array[i].id);
}

смотри выше поправленное

7thsky™
09.11.2005, 14:15
ох... во флэше загрузка асинхронная, загрузку ждать надо, для этого onLoad и существует

intro
09.11.2005, 14:18
Неа... Не работает...

iNils
09.11.2005, 14:35
дай свой xml который грузиться

unlexx
09.11.2005, 14:40
точно :) надо дождаться загрузки :)

intro
09.11.2005, 14:41
Вот XML который получается:
<?xml version="1.0" encoding="windows-1251" ?>
- <d>
- <data1>
<x>2</x>
<y>0</y>
<z>1</z>
</data1>
- <data2>
<x>1</x>
<y>2</y>
<z>3</z>
</data2>
- <data3>
<x>2</x>
<y>0</y>
<z>0</z>
</data3>
</d>

7thsky™
09.11.2005, 14:42
дай свой xml который грузиться
да все у него нормально грузиться, он просто не может понять
что вот для этого кода (который он пишет вне onLoad в том же кадре)


for (i=1; i<10; i++) {
trace(_global.xml_array[i].id);
}


массив _global.xml_array пустой так как xml еще не загрузился

intro
09.11.2005, 14:43
Вот и я так думаю. Т.к. андифинет выводит раньше, чем заполняется массив.
Так как же всё таки дождаться загрузки ф-ции, а уж потом выводить массив на экран?

unlexx
09.11.2005, 14:43
и с такой структурой ты делаешь доп массив?
ладно, делай setInterval или onEnterFrame
и проверяй переменную значение которой меняй по окончании заполнения массива

intro
09.11.2005, 14:54
Всё! Всем спасибо. Разобрался. Не судите строго... :)

iNils
09.11.2005, 14:58
_global.xml_array = new Array ();
var my_xml:XML = new XML ();
my_xml.ignoreWhite = true;
my_xml.load ("http://localhost/xml2.php");
my_xml.onLoad = function () {
k = 0;
for (j = 0; j < 3; j++) {
for (i = 0; i < 3; i++) {
_global.xml_array[k] = {id:this.childNodes[0].childNodes[j].childNodes[i].childNodes[0].nodeValue};
k++;
}
}
echo ();
};
_global.echo = function () {
for (i = 0; i < 9; i++) {
trace (_global.xml_array[i].id);
}
};

iNils
09.11.2005, 14:59
Всё! Всем спасибо. Разобрался. Не судите строго... :)
На будущее, нумерация нода начинается с 0. Поэтому циклы надо от 0 начинать, а не с 1.

intro
09.11.2005, 15:03
Спасибо!