Просмотр полной версии : Проблемы с масивом
У меня возникла проблема с массивом...
//Заполнение массива данными из 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, массива не существует... Надо ли массив объявлять как глобальный? Если да, то как?
сделай его в руте и заполняй его из onLoad как
_root.xml_array[j, i]
все переменные, что заданы в корне кадра (не в каком нибудь мувике) - считаются глобальными.
глобальные переменные существуют в течении одного кадра, если хочешь чтобы они были везде - растяни кадр на столько на сколько тебе нужно. * так было в flash mx, может в 7-ке и 8-ке что-нибудь могло измениться.
да, изменилось... в 8-ке если один раз задать в корне переменную она видна из любого кадра :)
все переменные, что заданы в корне кадра (не в каком нибудь мувике) - считаются глобальными.
они считаеются рутовыми, а не глобальными
глобальные переменные существуют в течении одного кадра, если хочешь чтобы они были везде - растяни кадр на столько на сколько тебе нужно. * так было в flash mx, может в 7-ке и 8-ке что-нибудь могло измениться.
они существуют в любом кадре и не надо ничего растягивать, создаются они через _global
Чувак, факт есть факт, а у кого какие понятия - зависит от распальцовки ;)
Чувак, факт есть факт, а у кого какие понятия - зависит от распальцовки ;)
Далеко ты с такими знаниями пойдешь :)
iNils - а ты посмотри массив то какой крутой :)
trace(xml_array[j, i].id);
почитать по теме (http://novemberain.com/livedocs/Help/ActionScriptLangRef/00001150.html)
iNils - а ты посмотри массив то какой крутой :)
trace(xml_array[j, i].id);
почитать по теме (http://novemberain.com/livedocs/Help/ActionScriptLangRef/00001150.html)
А слона то я и не приметил :)
обращение к двухмерному массиву осуществляется так
xml_array[j][i]
Странно, но почему-то у меня на заполнение массива такого формата xml_array[j][i] выдает ошибку, а вот формат xml_array[j, i] работает нормально без всяких проблем. И заполняется и выводится.
Плиз... Прошу... Ответьте конкретней, что мне надо сделать, что бы массив читалься вне функции? Заранее благодарен.
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]);
Ответьте конкретней, что мне надо сделать, что бы массив читалься вне функции? Заранее благодарен.
_global.xml_array = []
и все...
И еще про двухмерные массивы:
если тебе надо создать xml_array[i][j]
то после задания xml_array как массива
xml_array = []
нужно элемент xml_array[i] тоже сделать массивом
xml_array[i] = []
ну а трехмерный соответственно так
xml_array[i][j] = []
и будет xml_array[i][j][k] = "что то тут"
во флэше нету многомерных массивов, есть массивы ОДНОМЕРНЫЕ, многомерные эмулируются же таким образом, что элемент массива, сам является массивом
то бишь
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
Объявить глобальную так можно?
_global.xml_array:Array = new Array();
У меня синтаксическая ошибка...
нет, строгая типизация для _global не работает
надо так
_global.xml_array = new Array();
тебе же ЭкшенСкриптовским языком написали!!! Используй абсолютную адресацию (_root _level0 _global)
и вообще зачем делать массив из xml-ки?
можно же сразу брать значения из нод.
правильно что ошибка, сам посмотри что ты написал?! ты объявляешь переменную у объекта _global, при этом указываешь тип переменной, при этом не пишешь var :) короче напиши просто
_global.xml_array = new Array ();
ты объявляешь переменную у объекта _global, при этом указываешь тип переменной, при этом не пишешь var :)
Я не думаю, что он такие тонкости поймет.
Зачем по сто раз обращатся в XML, если один раз заполнил массив и с ним можно работать постоянно. Таа..а..к щаз попробуем...
Я не думаю, что он такие тонкости поймет.
прикалываетесь :(
прикалываетесь :(
когда прикалываюсь, я смайлик в конце ставлю.
если понял, то хорошо.
Не палит....
_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);
}
Зачем по сто раз обращатся в XML, если один раз заполнил массив и с ним можно работать постоянно. Таа..а..к щаз попробуем...
ага и хранить два массива данных вместо одного.
а к масиву ты будешь обращяться столько же раз
и многомерные массивы имеют свойство тормозить
вобщем вырабатывай свой стиль
Уже один массив... и тот не палит... :(
Помогите...please!
а так?
xml_array[k] = {id:this.childNodes[0].childNodes[j].childNodes[i].childNodes[0].nodeValue};
дык если человек боиться xml? он ООП вообще испугаеться :)
Массив то оно заполняет....ну именно в функции... а вне ф-ции не выводит...пишет андифинет. Такое ощущение что сначало выполняется вывод массива, а потом только ф-ция...
_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);
}
смотри выше поправленное
ох... во флэше загрузка асинхронная, загрузку ждать надо, для этого onLoad и существует
дай свой xml который грузиться
точно :) надо дождаться загрузки :)
Вот 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>
дай свой xml который грузиться
да все у него нормально грузиться, он просто не может понять
что вот для этого кода (который он пишет вне onLoad в том же кадре)
for (i=1; i<10; i++) {
trace(_global.xml_array[i].id);
}
массив _global.xml_array пустой так как xml еще не загрузился
Вот и я так думаю. Т.к. андифинет выводит раньше, чем заполняется массив.
Так как же всё таки дождаться загрузки ф-ции, а уж потом выводить массив на экран?
и с такой структурой ты делаешь доп массив?
ладно, делай setInterval или onEnterFrame
и проверяй переменную значение которой меняй по окончании заполнения массива
Всё! Всем спасибо. Разобрался. Не судите строго... :)
_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);
}
};
Всё! Всем спасибо. Разобрался. Не судите строго... :)
На будущее, нумерация нода начинается с 0. Поэтому циклы надо от 0 начинать, а не с 1.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.