繁体   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