Проблема с 2d Array в AS3 - PullRequest
0 голосов
/ 22 августа 2011

У меня странная проблема.Я пытаюсь сгенерировать матрицу со значением элементов 1 или 0 (заполнено случайным образом).Я храню значения в 2D-массив.Это код первого кадра.Кажется, все работает нормально.

var multiArr:Array = new Array([2], [2]);


    function generateMatrixXML() {

    for(var i:uint = 0; i < 2; i++)
    {
        for(var j:uint = 0; j < 2; j++)
        {
            multiArr[i][j] = getRandomNumber(0,1);;

        }
    }
    trace(multiArr);
    }

    function getRandomNumber(lower,upper):Number {
        return Math.floor(Math.random()*(1+upper-lower))+lower;
    }


    generateMatrixXML();

Когда я изменяю значение строки и столбца на 3, я получаю ошибку.

var multiArr:Array = new Array([3], [3]);


function generateMatrixXML() {

for(var i:uint = 0; i < 3; i++)
{
    for(var j:uint = 0; j < 3; j++)
    {
        multiArr[i][j] = getRandomNumber(0,1);;

    }
}
trace(multiArr);
}

function getRandomNumber(lower,upper):Number {
    return Math.floor(Math.random()*(1+upper-lower))+lower;
}


generateMatrixXML();

Ошибка типа: ошибка # 1010: термин не определен и не имеет свойств.at matrixArray_fla :: MainTimeline / generateMatrixXML () в matrixArray_fla :: MainTimeline / frame1 ()

Есть представление о том, что является причиной ошибки

Ответы [ 3 ]

3 голосов
/ 22 августа 2011

Я знаю, что на этот вопрос уже есть принятый ответ, но я думаю, что стоит отметить, что есть несколько разных решений. Хотя да, AS3 наивно не поддерживает двумерные массивы, он поддерживает массивы массивов, которые можно использовать для воспроизведения его функциональности.

Чтобы грубой силой инициализировать массив массивов, что и пытается сделать опера, существует несколько прямой подход. Чтобы сделать массив 3х3, можно написать:

var arr5:Array = new Array(new Array(3), new Array(3), new Array(3));

или, может быть, даже более просто и загадочно:

var arr6:Array = [[0,0,0],[0,0,0],[0,0,0]] // Create a 3x3 array with all values set to 0

и если вы собираетесь инициализировать значения сразу в цикле, вы можете даже сойти с рук:

var arr6:Array = [[],[],[]] // Create an empty '2D' array with 0 cols and 3 rows

Теперь я бы не стал делать массив размером 10x10, как этот, но он прост и работает для небольших многомерных массивов. Для больших многомерных массивов лучше всего инициализировать в цикле, как принятый ответ.

Но это также подходящее время, чтобы поговорить о векторах. Если вы создаете массив и знаете, что он всегда будет содержать определенный класс (и особенно если он всегда будет иметь определенную длину), то вы можете использовать векторный класс.

var rows:uint = 10, cols = 10;
var multiArray:Vector.<Vector.<Number>> = new Vector.<Vector.<Number>>(rows, true);
for(var i:uint = 0; i < rows; i++) multiArray[i] = new Vector.<Number>(cols, true);

Это создаст двумерный массив чисел 10x10 фиксированного размера. Определенно есть некоторые преимущества использования вектора со строгим типом над массивом.

Причина, по которой второй пример дает сбой, заключается в том, что, как и комментарий в принятом ответе, оба раза создается массив 1x2. Расширенная форма

// var multiArray:Array = new Array([3],[3])
var multiArr:Array = []
multiArray[0] = [3]
multiArray[1] = [3]

Обратите внимание, что multiArray[0][1] равно undefined. Но что еще более важно, multiArray [2] - это undefined все вместе. Сбой при попытке сослаться на multiArray[2][0], потому что его просто нет.

Также обратите внимание, что Array во флэш-памяти запасные массивы (класс Vector имеет плотность ). Это означает, что вы можете делать такие вещи, как:

var arr7:Array = [];
arr7[100] = 1;

Он оставляет позиции от 0 до 99 как undefined и просто устанавливает индекс 100 на 1

3 голосов
/ 22 августа 2011

Эта строка:

var multiArr:Array = new Array([3], [3]);

Создает массив, содержащий два массива, каждый из которых имеет один элемент, содержащий число 3. Это означает, что при переходе к третьей итерации multiArr[i] не определено.Это явно неправильное понимание того, как определять массивы в AS3 1

Вам действительно нужно создать свои массивы в цикле:

var multiArr:Array = [];
var iterations:int = 3;

function generateMatrixXML() {
    for(var i:uint = 0; i < iterations; i++)
    {
        multiArr[i] = [];
        for(var j:uint = 0; j < iterations; j++)
        {
            multiArr[i][j] = getRandomNumber(0,1);

        }
    }
    trace(multiArr);
}

function getRandomNumber(lower,upper):Number {
    return Math.floor(Math.random()*(1+upper-lower))+lower;
}

generateMatrixXML();

Сноска 1: Практика флэш-кодирования требует, чтобы вы определили новый массив с пометкой []:

var arr1:Array = []; // create a new array
var arr2:Array = [1]; // create an array with  one element, the number 1
var arr3:Array = new Array(1); // defines a new array with a pre-set length of 1
var arr4:Array = new Array(1,2); // defines a new array with two elements, the numbers 1 and 2

Последний пример считается плохой практикой кодирования в AS3 из-за путаницы с третьимпример.

1 голос
/ 30 мая 2012
Creating a 2D Array

var multiDimensionalArray:Array = new Array();
var boolArray:Array;
var MAX_ROWS = 5;
var MAX_COLS = 5;

//initalize the arrays
for (var row = 0; row <= MAX_ROWS; row++)
{
    boolArray = new Array();

    for (var col = 0; col <= MAX_COLS; col++)
        boolArray.push(false);
    }

    multiDimensionalArray.push(boolArray);
}

//now we can set the values of the array as usual
for (var row = 0; row <= MAX_ROWS; row++)
{
    for (var col = 0; col <= MAX_COLS; col++)
        boolArray[row][col] = true;
        trace('boolArray ' + row + ',' + col + ' = ' + boolArray[row][col]);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...