Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Трехмерный массив с подобъектами (http://www.flasher.ru/forum/showthread.php?t=113355)

qazwsx 26.06.2008 12:09

Цитата:

Сообщение от uglan (Сообщение 748001)
Мне кажется массив удобнее(без заморочки с кучей childNodes), если он вообще может работать с тройной структурой.

Можно даже в строку твою трёх уровневую структуру записать :)

uglan 26.06.2008 12:12

Цитата:

Сообщение от qazwsx (Сообщение 748003)
Код:

var a:Array = [];
a[0] = [];
a[0][0] = ':Q';
trace(a[0][0]);


А вот так не работает
Код:

var a:Array = [];
a[0] = [];
a[0][0] = 'AGA';
a[0][0][0] = []
a[0][0][0] = 'UGU';
trace(a[0][0][0]);


Alex_beginner 26.06.2008 12:14

Что некорректно в этом коде?!

Код:

var arr:Array = [];
arr[0] = []
arr[0][0] = "ege"
arr[0][1] = "fgh"
trace(arr[0].length)

//Выведет 2

Здесь без потери ранее записанных данных при изменении размерности массива не обойтись. Потому и не работает.
Нужно определить размерность массива заранее. А вот размер каждого измерения Вы можете создавать динамически.
Цитата:

Код:

var a:Array = [];
a[0] = [];
a[0][0] = 'AGA';
a[0][0][0] = []
a[0][0][0] = 'UGU';
trace(a[0][0][0]);


Давайте разберем этот код подробнее для понимания проблемы.

В первой строке Вы создаете одномерный массив a.
Во второй строке, Вы создаете второе измерение массива a
В третьей строке Вы присваиваете ячеке двумерного массива значение "АGA". Пока все вроде бы корректно.
В четвертой строке, Вы пытаетесь создать уже четвертое измерение минуя 3. Разумеется это невозможно. Поэтому, Вы вынуждены будете ячейку a[0][0] =="AGA" переопределить массивом создающим 3-е измерение. Разумеется "AGA" сохранено не будет.

Код:

var a:Array = [];
a[0] = [];
a[0][0] = 'AGA';
a[0][0] = []
a[0][0][0] = 'UGU';
trace(a[0][0][0]);

//"AGA" больше не существует!!!

uglan 26.06.2008 12:14

А вот так не работает:
var a:Array = [];
a[0][0][0] = [];
a[0][0][0] = ':Q';
trace(a[0][0][0]);

А вот так
var arr:Array = [];
Код:

arr[0] = []
arr[0] = "1"
arr[1] = "2"
arr[2] = "3"
arr[3] = "4"
arr[0][0] = "ege"
arr[0][1] = "fgh"
trace(arr[0].length)

Выведет 1...

Чтобы создать цикл мне нужно будет знать длину каждого уровня массива.
for(i=0;i<arr.length;++i){
for(u=0;u<arr[i].length;++u){
}
}
...

alexcon314 26.06.2008 13:38

uglan, не надо постить несколько сообщений подряд. Пользуйтесь кнопкой "Изменить"

uglan 26.06.2008 13:55

Давайте разберем этот код подробнее для понимания проблемы.

В первой строке Вы создаете одномерный массив a.
Во второй строке, Вы создаете второе измерение массива a
В третьей строке Вы присваиваете ячеке двумерного массива значение "АGA". Пока все вроде бы корректно.
В четвертой строке, Вы пытаетесь создать уже четвертое измерение минуя 3. Разумеется это невозможно. Поэтому, Вы вынуждены будете ячейку a[0][0] =="AGA" переопределить массивом создающим 3-е измерение. Разумеется "AGA" сохранено не будет.

Код:

var a:Array = [];
a[0] = [];
a[0][0] = 'AGA';
a[0][0] = []
a[0][0][0] = 'UGU';
trace(a[0][0][0]);

//"AGA" больше не существует!!![/quote]

Хорошо в таком случае как мне задействовать каждый уровень?
то есть чтобы значения хранились тут
a[0] = 1
a[1] = 1
и на других уровнях
a[0][0] = 2
a[0][1] = 2
a[0][2] = 2
a[1][0] = 2.1
a[1][1] = 2.2
a[1][2] = 2.1

и т.д.

Alex_beginner 26.06.2008 13:59

uglan!

Давайте разберем и этот код.

Цитата:

Код:

arr[0] = []
arr[0] = "1"
arr[1] = "2"
arr[2] = "3"
arr[3] = "4"
arr[0][0] = "ege"
arr[0][1] = "fgh"
trace(arr[0].length)





В первой строке Вы создаете второе измерение не создав первое (ошибка).
В последующих четырех строках Вы записываете значения в 4 ячейки несуществующего одномерного массива.
А вот в третьей и четвертой пытаетесь присвоить значение не существующей ячейке несуществующего двумерного массива (массив arr на этот момент одномерный). Поэтому length выдает что попало (в данном случае 1).
Как на самом деле должен выглядеть этот код?!

Вот так:
Код:

arr = []
arr[0] = "1"
arr[1] = "2"
arr[2] = "3"
arr[3] = "4"
arr[0] = []; создаем пустой массив-измерение в ячейке [0]
arr[0][0] = "ege"
arr[0][1] = "fgh"
trace(arr[0].length)

Но! ячейка arr[0] будет переопределена вторым измерением.

Цитата:

Код:

Хорошо в таком случае как мне задействовать каждый уровень?
то есть чтобы значения хранились тут
a[0] = 1
a[1] = 1
и на других уровнях
a[0][0] = 2
a[0][1] = 2
a[0][2] = 2
a[1][0] = 2.1
a[1][1] = 2.2
a[1][2] = 2.1


Я уже говорил, что с размерностью (не путать с размером измерения) нужно сразу определиться. Давайте попробуем создать двухступенчатую иерархию вот так:

Код:

a = []
a[0] = 1;
a[1] = [];
a[1][0] = 2;
a[1][1] = [];
...

По аналогии можно создать любую иерархию.

terbooter 26.06.2008 14:14

Во флеше нет трехмерных массивов.
Но можно использовать Массив массивов.

Конструкция вида

Код:

var zeroObject:Object = new Object();

var coordinats:Array= new Array();
coordinats[0] = new Array();
coordinats[0][0] = new Array();
coordinats[0][0][0] = zeroObject;

Лишь имитирует многомерный массив

Alex_beginner 26.06.2008 14:20

Цитата:

Во флеше нет трехмерных массивов.
Если уж говорить на чистоту, то во Флеше вообще нет массивов в том понимании, что присутствует в базовых языках (Delphi, C++).
Проблема здесь не в создании вложенных массивов, а в сохранности данных на каждом иерархическом уровне при их создании. Как говориться Заказчик хочет и "из ружья не выстрелить и двух зайцев убить".

uglan 26.06.2008 17:02

Разочарован... Не знаю как в C++ но в VB точно можно было делать массивы такого вида какой угодно длины. a[0][0][0][0]...
Значит буду использовать xml.

Всем спасибо!


Часовой пояс GMT +4, время: 00:33.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.