Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Вопрос по заполнению многомерного массива. (http://www.flasher.ru/forum/showthread.php?t=169373)

fantomasdnb 03.10.2011 22:15

Вопрос по заполнению многомерного массива.
 
Почитав, форум написал следующее:

Код AS3:

if (commandBlock.added)
{                               
        var numChildren:uint = this.codeCont.codePlateSp.numChildren;
 
        for (var i:uint = 0; i < numChildren; i++)
        {
                var block:commandBlock = this.codeCont.codePlateSp.getChildAt(i) as commandBlock;
 
                instruct = block.getCommand;                               
 
                commandArray[instruct.charAt(0)].push(instruct.charAt(1));
                commandArray[instruct.charAt(0)][instruct.charAt(1)] =  instruct.substr(2,3);
 
                trace(commandArray["A"]);
        }                               
}

У меня, например, цикл выполняется два раза, первый раз instruct получает строку "A11RA", второй раз "A01HO".
Все это я хочу запихать в двумерный массив так, чтобы в commandArray были массивы с названием Первых букв в строке, в которых лежат элементы с названием из вторых символов строк, в которых лежат остальные три буквы.
Соответственно чисто теоритически, в данном примере должен быть массив commandArray, в котором есть массив A, в котором два массива: 1, в котором лежит 1RA и 0, в котором лежит 1HO.


Но он выдает: TypeError: Error #1010: Термин не определен и не имеет свойств.

Код конечно диковатый, но все же, что собственно не так?)

Psycho Tiger 03.10.2011 22:40

Код:

if (commandBlock.added)
{                               
        var numChildren:uint = this.codeCont.codePlateSp.numChildren;
 
        for (var i:uint = 0; i < numChildren; i++)
        {
                var block:commandBlock = this.codeCont.codePlateSp.getChildAt(i) as commandBlock;
 
                instruct = block.getCommand;                               
                commandArray[instruct.charAt(0)] = [];
                commandArray[instruct.charAt(0)].push(instruct.charAt(1));
                commandArray[instruct.charAt(0)][instruct.charAt(1)] =  instruct.substr(2,3);
 
                trace(commandArray["A"]);
        }

Добавлено через 2 минуты
И кстати, push кладёт значение на индекс length, а [] обращается по ключу.
Т.е. Массив ["a","b",c"], сделать push("d") - получим ["a","b","c","d"], при этом индекса "d" не существует: существует элемент с индексом 3, значение которого "d".

fantomasdnb 03.10.2011 23:35

да я писал эту зеленую строчку, но результат получался не такой какой надо, трейс выводил:
1,1RA
1HO
тоесть он явно выводил не полно.
Подскажите тогда , как сделать не через пуш, чтобы был индекс ?

dimarik 03.10.2011 23:51

по индексу
Код AS3:

array[index] = value;


fantomasdnb 04.10.2011 00:07

блин, я не так сказал наверное. Вобщем я хочу, чтоб по сути обращение было:
Код AS3:

commandArray["A"]["0"] = "1HO";

Если я просто равно напишу, я просто значение заменю значение, а мне надо чтобы в А добавлялись другие массивы.

Psycho Tiger 04.10.2011 00:41

Код AS3:

commandArray = {};
commandArray["A"] = {};
commandArray["A"]["0"]="1HO";


fantomasdnb 04.10.2011 00:50

и так код теперь выглядит так

Код AS3:

 
if (commandBlock.added)
{                               
        var numChildren:uint = this.codeCont.codePlateSp.numChildren;
 
        for (var i:uint = 0; i < numChildren; i++)
        {
                var block:commandBlock = this.codeCont.codePlateSp.getChildAt(i) as commandBlock;                                       
                instruct = block.getCommand;                                                               
 
                commandArray[instruct.charAt(0)]={};
                commandArray[instruct.charAt(0)][instruct.charAt(1)] = instruct.substr(2,3);
 
 
 
        }                               
        trace(commandArray["A"]["1"]);
        trace(commandArray["A"]["0"]);
}

но строка commandArray["A"] = {}; на втором шаге цикла, убивает всё что было добавлено на первом, тоесть трейс выводит
undefined
1HO

Psycho Tiger 04.10.2011 01:49

Ну да. Вы создаете на каждой итерации новый хэш. А надо создать его один раз. А в цикле всё повторяется. Скажите мне, что надо сделать? :)

fantomasdnb 04.10.2011 02:01

ну собственно, я пытаюсь сделать реализацию машины Тьюринга. Я собираю все инструкции, которые были введены. Соответственно, для каждого состояния (A,B,C), в зависимости от символа на ленте (1,0) выполнять команду 1RH,0HO. Решил использовать подобную структуру, т.к. очень легко искать действие по состоянию и символу.

Psycho Tiger 04.10.2011 19:15

Я не о том )
Я ожидал услышать что-то вроде: "Ааа, ну надо ведь чтобы хэш создался один раз. Надо вынести его за тело цикла!", но Ваш ответ тоже неплох )


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

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