Форум 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)
-   -   FlashMX не поддерживает четырехмерные массивы? (http://www.flasher.ru/forum/showthread.php?t=83133)

xintrea 28.07.2006 02:32

FlashMX не поддерживает четырехмерные массивы?
 
Господа, что-то не могу понять одну вещь...

Вроде как массивы в FLASH могут быть сколь угодно многомерными, это обусловлено объектной моделью, да и в документации ограничение на размерность не нашел.

А вот столкнулся таки со следующей неприятностью. Вот простой код.

Код:

num=1;

logictab=new Array();

for(n=0;n<num;n++)
 {
  // Заполняются начальные таблицы
  for(i=0;i<=9;i++)
  for(j=0;j<=9;j++)
    logictab[n,0,i,j]=0;

  // В центр таблицы ставится игрок с направлением 1
  logictab[n,0,4,4]=1;
 }

// Проверяем, что лежит в массиве
for (y=0; y<9; y++)
 for (x=0; x<9; x++)
  trace("logictab x "+x+" y "+y+" is "+logictab[0,0,x,y]);


В результате я должен получить

Код:

...
logictab x 7 y 3 is 0
logictab x 8 y 3 is 0
logictab x 0 y 4 is 0
logictab x 1 y 4 is 0
logictab x 2 y 4 is 0
logictab x 3 y 4 is 0
logictab x 4 y 4 is 1
logictab x 5 y 4 is 0
logictab x 6 y 4 is 0
logictab x 7 y 4 is 0
logictab x 8 y 4 is 0
logictab x 0 y 5 is 0
logictab x 1 y 5 is 0
...


А на деле вижу такую картину

Код:

...
logictab x 7 y 3 is 0
logictab x 8 y 3 is 0
logictab x 0 y 4 is 1
logictab x 1 y 4 is 1
logictab x 2 y 4 is 1
logictab x 3 y 4 is 1
logictab x 4 y 4 is 1
logictab x 5 y 4 is 1
logictab x 6 y 4 is 1
logictab x 7 y 4 is 1
logictab x 8 y 4 is 1
logictab x 0 y 5 is 0
logictab x 1 y 5 is 0
...

О чем эта картина говорит? Мне кажется о том, что четвертая координата не рассматривается интерпретатором. Так ли это?

Если это так, то можно ли изящно это ограничение обойти?

silin 28.07.2006 08:34

не только четвертая, но уже и вторая:
посмотри что ты создаешь:
Код:

...
for(i=0;i<=9;i++)
  for(j=0;j<=9;j++){
        trace((n,0,i,j))
            logictab[n,0,i,j]=0;
...
  }


iNils 28.07.2006 12:03

4-мерный массив создается так
Код:

a = [[[[5]]]];
trace (a[0][0][0][0]);
//// или так
a = [];
a[0] = [];
a[0][0] = [];
a[0][0][0] = [];
a[0][0][0][1] = 6;
trace (a[0][0][0][1]);


motor4ik 28.07.2006 12:09

да, меня тоже это всегда убивает, забываю ставить a[0] = []; присваиваю сразу a[0][0] = 666; ((((

iNils 28.07.2006 12:36

Код:

/*
arrayName - имя массива, если его не существует, то он создается
arrayD - индекс элемента для многомерного массива
arg - значение элемента
*/
arrayN = function (arrayName, arrayD, arg) {
        if (!this[arrayName]) {
                this[arrayName] = [];
        }
        var arrayTemp = this[arrayName];
        var len = arrayD.length - 1;
        for (var i = 0; i < len; i++) {
                if (!arrayTemp[arrayD[i]]) {
                        arrayTemp[arrayD[i]] = [null];
                }
                arrayTemp = arrayTemp[arrayD[i]];
        }
        arrayTemp[arrayD[len]] = arg;
};
arrayN ('c', [1, 1], 50);
arrayN ('a', [5, 2, 3, 6], 100);
arrayN ('a', [5, 2, 3, 7], 200);
b = [2, 2];
arrayN ('b', [2, 0, 0, 1], 300);
////
trace (c[1][1]);
trace (a[5][2][3][6]);
trace (a[5][2][3][7]);
trace (b[0]);
trace (b[1]);
trace (b[2][0][0][1]);


xintrea 28.07.2006 14:38

2 iNils

Ваш вышеприведенный код выдет следующее

Код:

undefined
undefined
undefined
2
2
undefined

Может нужно где-то в настройках среды что-то выставить?

iNils 28.07.2006 14:45

А вы функцию arrayN вставили?

xintrea 28.07.2006 15:20

Да, вставил.

Только вставил задом наперед - я привык в скриптовых языках функции размещать в конце. И поместил вашу функцию после вызывающих ее команд. Ну и получил сюрприз - ошибок нет, что использую неизвестную функцию, все молча работает только нужные действия не делает...

Только что перенес в "верх" кода - заработало. В связи с этим вопрос - можно в двух словах объяснить, есть ли разница в классическом определении функций

Код:

function name(var1, var2)
{
 ...
}

И тем как вы определяете функцию

Код:

name = function(var1, var2)
{
 ...
};

?

motor4ik 28.07.2006 15:28

я что то не понял в чем прикол функции arrayN?

Код:

trace (c);
выдает
Цитата:

undefined,null,50

Код:

trace (a);
выдает
Цитата:

undefined,undefined,undefined,undefined,undefined,null,undefined,null,undefined,undefined,null,undefined,undefined,undefined,undefined,undefined,100,2 00

iNils 28.07.2006 15:37

Я воспользовался литералом функции.
Если сделать "классическим" способом, то функция будет доступна везде и даже до ее определения (это касается одного и того же кадра). А литералы функции будут доступны только после их определения.

Поэтому если вам не нравится такой способ смените его на
Код:

function arrayN (arrayName, arrayD, arg) {
...



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

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