2011-08-22 44 views
0

我遇到了一個奇怪的問題。我正在嘗試生成一個元素值爲1或0(隨機填充)的矩陣。我將這些值存儲到二維數組中。這是第一幀的代碼。一切似乎都工作正常。AS3中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(); 

TypeError:錯誤#1010:術語未定義且沒有屬性。 在matrixArray_fla :: MainTimeline/generateMatrixXML() 在matrixArray_fla :: MainTimeline /幀1()

有任何想法,以什麼是錯誤的原因

回答

3

這條線:

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

是創建一個包含兩個數組的數組,每個數組都有一個包含數字3的元素。這意味着當您進入第三次迭代時multiArr[i]未定義。這顯然是如何在AS3定義數組的誤解

實際上,你需要在循環中創建數組:

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:的Flash編碼做法需要你定義新的數組與[]符號:

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不好的編碼實踐我t引起第三個例子。

+0

你說的沒錯,但爲什麼不是第一例失敗? – duedl0r

+0

,因爲在第一種情況下,他只迭代兩次。第一行在_both_個案中定義了一個2x2矩陣。 – shanethehat

+0

爲什麼是2x2?定義的數組中只有1個元素? – duedl0r

3

我知道這個問題已經有一個可以接受的答案,但我認爲值得注意的是有幾個不同的解決方案。雖然,是的,AS3不會天真地支持二維數組,但它支持數組的陣列,可用於複製其功能。

爲了強力初始化一個數組的數組,這是操作正在嘗試做的事情,這裏有一個比較直接的方法。爲了使一個3x3的陣列,可以這樣寫:

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二維數組數組。在數組上使用強類型的Vector肯定有一些好處。

第二個例子失敗的原因是,像接受的答案中的註釋一樣,兩次創建一個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; 

它通過99爲undefined離開位置0,只是將指數100 1

1
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]); 
    } 
}