簡體   English   中英

Unity 2D鋸齒狀數組,數組索引超出范圍

[英]Unity 2D Jagged Array , Array index is out of range

我有這個二維數組,它給我一個數組索引超出范圍 ,問題。 此問題的原因是什么,我該如何解決?

編輯 :是的,對此感到抱歉。 我將在這里包括我想做的事情:

所以即時通訊試圖使鋸齒數組。 所以我有很多platforms ,我想通過numOfPlatforms ,每個平台都有它的Size ,它的SizerandomXSize 現在,我要在每個平台上標記一個點,即每0.5個點,這就是為什么我做了

(randomXSize - 0.5)

但是我不知道我需要做多少次,所以我做了

randomXSizeSegments = randomXSize * 2;

計算每個randomXSize 0.5。

也就是說,如果第一個平台“ 0”的randomXSize為3

我希望數組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”的randomXSize為7,則我希望數組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);
        }

    }

}

在外部for循環的第一個迭代中, randomXPosSegments = new int[a][]由於a = 0創建了一個“空”數組。 然后,當您嘗試訪問該數組的“第0個”(即第一個)元素時,由於沒有位置[0]可供訪問,它將引發該異常。

要創建一個包含一個元素的數組,您需要聲明其大小為1

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

如果將其大小設置為0 沒有要分配給的“第0”個職位:

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

我不確定如何幫助您解決此問題,因為您沒有解釋您要完成的工作,並且現有代碼沒有意義(例如,您有一個從未使用過的迭代器b ,請繼續設置randomXPosSegments[a]到一個新的空數組)。

編輯:

首先要注意以下幾點:

  • 要存儲類似0.5十進制值, randomXPosSegments將需要是一個double數組,而不是int 我們還需要在循環之外創建此數組,否則我們將在每次迭代中繼續創建一個新的空數組。 同樣,您需要在內部for循環之外初始化randomXPosSegments[a] ,否則每次都將其重置。
  • 我創建了一個GetRandomXSize()函數,因為現在它的值永遠不會改變。
  • 在內部for循環內部,我使用randomXSize - (0.5 * b)來獲取值randomXSize - (0.5 * b) 7, 6.5, ... b將從0開始,因此在第一次迭代中,它將只是randomXSize 然后,它每次通過循環都會減去0.5
  • 為了獲得0作為鋸齒狀數組中的最后一個結果,我必須將內部for循環的條件更改為b <= randomXSizeSegments ,並確保將其初始化為足夠大以適合結果(請注意, new double[randomXSizeSegments + 1] +1 new double[randomXSizeSegments + 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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM