-2

代码循环遍历数组并将每个索引初始化为“*”。但是,我正在接受IndexOutOfRangeExceptionCave[i,j]希望得到一些指导。

char[,] Cave = new char[GridHeight, GridWidth];

    for (int i = 0; i < GridWidth; i++)
    {
        for (int j = 0; j < GridHeight; j++)
        {
            Cave[i, j] = '*'; //Error Here
        }
    }
  • 为澄清起见GridHeightGridWidth声明如下

    public const int GridHeight = 5;

    public const int GridWidth = 7;

4

2 回答 2

2

您正在声明一个 5 x 7 数组,但随后尝试访问(例如)Cave[7,5],因为您的变量是向后的。

char[,] Cave = new char[GridHeight, GridWidth];  // declare 5x7 array

for (int i = 0; i < GridWidth; i++)        // range of i is 0 - 6
{
    for (int j = 0; j < GridHeight; j++)   // range of j is 0 - 4
    {
        Cave[i, j] = '*'; //Error Here     // try to access Cave[6,4] - oops!
    }
}

尝试交换它们:

char[,] Cave = new char[GridWidth, GridHeight];

或者如果对您更有意义,请交换另一对:

char[,] Cave = new char[GridHeight, GridWidth];

for (int i = 0; i < GridHeight; i++)
{
    for (int j = 0; j < GridWidth; j++)
    {
        Cave[i, j] = '*';
    }
}
于 2014-05-05T23:48:57.020 回答
1

通常我们看待事物的方式和编译器的方式是不一样的。

这是您的程序输出:

int GridHeight = 10;
int GridWidth = 5; 

char[,] Cave = new char[GridHeight, GridWidth];

for (int i = 0; i < GridWidth; i++)
{
   for (int j = 0; j < GridHeight; j++)
   {
        Console.Write(i+","+ j +"   ");
      // Cave[i, j] = '*'; //Error Here
   }
    Console.WriteLine();
}

它输出:

0,0   0,1   0,2   0,3   0,4   0,5   0,6   0,7   0,8   0,9   
1,0   1,1   1,2   1,3   1,4   1,5   1,6   1,7   1,8   1,9   
2,0   2,1   2,2   2,3   2,4   2,5   2,6   2,7   2,8   2,9   
3,0   3,1   3,2   3,3   3,4   3,5   3,6   3,7   3,8   3,9   
4,0   4,1   4,2   4,3   4,4   4,5   4,6   4,7   4,8   4,9   

如您所见,第一个变量是实际宽度,而不是高度。所以要么重命名它们,要么交换它们:)

每当您考虑二维数组时(至少在控制台输出方面),请记住第一个轴是X(从左到右,升序),第二个是Y(从上到下,升序)。

于 2014-05-05T23:52:44.083 回答