【问题标题】:Unity 2D Jagged Array , Array index is out of rangeunity 2D 锯齿状数组,数组索引超出范围
【发布时间】:2014-12-27 04:03:51
【问题描述】:

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

编辑:是的,很抱歉。我将在这里包括我想要做的事情:

所以我试图制作锯齿状数组。 所以我有很多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);
        }

    }

}

【问题讨论】:

  • 我已经更新了我的答案,以回应您对您要完成的工作的解释。

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


【解决方案1】:

在外部 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) 来获取像 7, 6.5, ... 这样的值。 b 将以 0 开始,所以在第一次迭代中,它将只是 randomXSize。然后它会在每次循环时减去一个0.5
  • 要获得0 作为锯齿状数组中的最后一个结果,我必须将内部 for 循环的条件更改为b &lt;= randomXSizeSegments,并确保我将其初始化为足够大以适应结果(注意+1 in 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);
    }
}

【讨论】:

    猜你喜欢
    • 2018-09-09
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多