2014-10-30 67 views
1

我有這個2D數組,它給我一個數組索引超出範圍,問題。這個問題的原因是什麼,我該如何解決這個問題?Unity 2D鋸齒陣列,數組索引超出範圍

編輯:是的,對不起。我將包括我想在這裏做什麼:

所以即時嘗試使鋸齒陣列哪個。 所以我有一些platforms,numOfPlatforms 我想通過他們,並且每個平臺有其Size這是randomXSize。 而現在,我想在標記每個平臺是每0.5點,這就是爲什麼我做

(randomXSize - 0.5) 

但我不知道我將需要多少次這樣做了,所以我做

randomXSizeSegments = randomXSize * 2; 

要計算每個randomXSize有多少個0.5。

所以,換句話說, 如果第一平臺「0」的3

一個randomXSize我想要的陣列randomXSizeSegments要這樣看

randomXSizeSegments[1][0] = 3 
randomXSizeSegments[0][1] = 2.5 
randomXSizeSegments[0][2] = 2 
randomXSizeSegments[0][3] = 1.5 
randomXSizeSegments[0][4] = 1 
randomXSizeSegments[0][5] = 0.5 
randomXSizeSegments[0][6] = 0 

如果第二平臺「1」有一個我想要的陣列randomXSizeSegments要這樣看

randomXSizeSegments[1][0] = 7 
randomXSizeSegments[1][1] = 6.5 
randomXSizeSegments[1][2] = 6 
randomXSizeSegments[1][3] = 5.5 
randomXSizeSegments[1][4] = 5 
randomXSizeSegments[1][5] = 4.5 
randomXSizeSegments[1][6] = 4 
randomXSizeSegments[1][7] = 3.5 
randomXSizeSegments[1][8] = 3 
randomXSizeSegments[1][9] = 2.5 
randomXSizeSegments[1][10] = 2 
randomXSizeSegments[1][11] = 1.5 
randomXSizeSegments[1][12] = 1 
randomXSizeSegments[1][13] = 0 


void Debugging_One() { 

    for(int a = 0; a < numOfPlatforms; a = a + 1) { 
     randomXPosSegments = new int[a][]; 
     randomXSizeSegments = randomXSize * 2; 
     //Debug.Log(a); 
     //Debug.Log(randomXSizeSegments); 
     for(int b = 0; b < randomXSizeSegments; b = b + 1) { 
      // randomXPosSegments[a][b] = 0; 
      randomXPosSegments[a] = new int[] {(int)(randomXSize - 0.5)}; 
      //Debug.Log(b); 
     } 

    } 

} 
+0

我已經更新了我的回答,以迴應你對你要完成的事情的解釋。 – 2014-10-31 14:47:14

回答

1

在外循環的第一次迭代中,從a = 0開始,randomXPosSegments = new int[a][]會創建一個「空」陣列。當你嘗試訪問該數組的「第0個」(即第一個)元素時,它會拋出該異常,因爲沒有要訪問的位置[0]

要對一個元素創建一個數組,你需要聲明它的大小爲1:如果你給它的大小爲0

var singleElementArray = new int[1]; 
singleElementArray[0] = 42; 
Debug.WriteLine(singleElementArray[0]); // Prints '42' 

。沒有存在分配給了「零」的位置:

var singleElementArray = new int[0]; 
singleElementArray[0] = 42; // Throws IndexOutOfRangeException 

我不知道怎麼幫你解決這個問題,因爲你沒有解釋你想什麼來實現和現有的代碼沒有按」沒有意義(例如你有一個迭代器b你永遠不會使用,你繼續將randomXPosSegments[a]設置爲一個新的空數組)。

編輯:

有幾件事情第一:

  • 要存儲像0.5十進制值,randomXPosSegments將需要的double,而不是int陣列。我們還需要在循環之外創建它,否則我們將在每次迭代中繼續創建一個新的空數組。像明智一樣,您需要在內部for-loop之外初始化randomXPosSegments[a],否則您將每次重置它。
  • 我創建了GetRandomXSize()函數,因爲現在它的值永遠不會改變。
  • 在內部for循環中,我使用randomXSize - (0.5 * b)來獲取像7, 6.5, ...這樣的值。 b將以0開頭,因此在第一次迭代時,它將僅爲randomXSize。然後它每次通過循環時都會減去0.5
  • 要獲得0爲鋸齒狀數組中的最後一個結果,我不得不在內部進行循環改變條件b <= randomXSizeSegments,並確保我初始化它必須足夠大,以適應結果(請注意new double[randomXSizeSegments + 1]+1) 。

下面是適用於我的代碼。

var randomXPosSegments = new double[numOfPlatforms][]; 
for(int a = 0; a < numOfPlatforms; a = a + 1) { 
    var randomXSize = GetRandomXSize(); 
    var randomXSizeSegments = randomXSize * 2; 
    randomXPosSegments[a] = new double[randomXSizeSegments + 1]; 
    for(int b = 0; b <= randomXSizeSegments; b = b + 1) { 
     randomXPosSegments[a][b] = randomXSize - (0.5 * b); 
    } 
}