2014-10-30 68 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); 
    } 
}