Unity 2D Jagged Array,Array索引超出范围

时间:2014-10-30 22:27:48

标签: c# for-loop unity3d multidimensional-array jagged-arrays

我有这个2D数组,它给我一个数组索引超出范围,问题。这个问题的原因是什么,我该如何解决?

编辑:是的,对不起。我将在这里包括我想要做的事情:

所以我试图制作锯齿状数组。 所以我有一些platformsnumOfPlatforms 我想通过它们,每个平台的Size都是randomXSize。 而现在,我想在每个平台上标记一个点,每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);
        }

    }

}

1 个答案:

答案 0 :(得分:1)

在外部for循环的第一次迭代中,randomXPosSegments = new int[a][]创建一个&#34;空的&#34;自a = 0以来的数组。然后,当您尝试访问&#34; 0th&#34; (即第一个)该数组的元素,它抛出该异常,因为没有位置[0]可以访问。

要创建包含一个元素的数组,您需要声明它的大小为1

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

如果你给它的大小为0。没有&#34; 0th&#34;存在的位置分配给:

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

我不确定如何帮助您解决这个问题,因为您还没有解释您要完成的任务以及现有代码没有意义(例如,您有一个迭代器{{1}你永远不会使用,你继续将b设置为一个新的空数组。

修改

首先要做的几件事:

  • 要存储像randomXPosSegments[a]这样的小数值,0.5需要是randomXPosSegments而不是double的数组。我们还需要在循环外创建它,或者我们将在每次迭代时继续创建一个新的空数组。同样明智的做法是,您需要在内部for循环之外初始化int,否则您每次都会重置它。
  • 我创建了一个randomXPosSegments[a]函数,因为它现在的值永远不会改变。
  • 在内部for循环中,我使用GetRandomXSize()获取randomXSize - (0.5 * b)之类的值。 7, 6.5, ...将从b开始,因此在第一次迭代时,它将只是0。然后它会在每次循环时减去randomXSize
  • 要将0.5作为锯齿状数组中的最后一个结果,我必须将内部for循环的条件更改为0,并确保将其初始化为足够大以适合结果(注意b <= randomXSizeSegments中的+1)。

这是适用于我的代码。

new double[randomXSizeSegments + 1]