Почему вылетает IndexOutOfRangeExeption?

284
26 марта 2018, 22:28
double n = Convert.ToInt16(Console.ReadLine());
double doubleSize = Math.Pow(2,n);
int size = (int) doubleSize;
double[,] heightMap = new double[size,size];
Random rnd = new Random();
if (size == 2)
{
    heightMap[0, 0] = rnd.Next(0, 10); // Л-в
    Console.WriteLine(heightMap[0, 0]);
    heightMap[size, 0] = rnd.Next(0, 10); // Л-н
    Console.WriteLine(heightMap[size,0]);
    heightMap[0, size] = rnd.Next(0, 10); // П-в
    Console.WriteLine(heightMap[0, size]);
    heightMap[size, size] = rnd.Next(0, 10); //  П-н
    Console.WriteLine(heightMap[size, size]);
    heightMap[1, 1] = (heightMap[0, 0] + heightMap[size, 0] + heightMap[0, size] + heightMap[size, size]) / 4 + rnd.Next(-4, 4); // Центр
    Console.WriteLine(heightMap[1, 1]);
    heightMap[0, 1] = heightMap[0, 0] + heightMap[1, 1] + heightMap[0, size] + rnd.Next(-1, 1);
    Console.WriteLine(heightMap[0, 1]);
    heightMap[1, 0] = heightMap[0, 0] + heightMap[1, 1] + heightMap[size, 0] + rnd.Next(-1, 1);
    Console.WriteLine(heightMap[1, 0]);
    heightMap[1, size] = heightMap[size, size] + heightMap[1, 1] + heightMap[0, size] + rnd.Next(-1, 1);
    Console.WriteLine(heightMap[1, size]);
    heightMap[size, 1] = heightMap[size, 0] + heightMap[1, 1] + heightMap[size, size] + rnd.Next(-1, 1);
    Console.WriteLine(heightMap[size, 1]);
}

вылетает на строке heightMap[size, 0] = rnd.Next(0, 10); // Л-н если ввести 1

Answer 1

heightMap[size, 0] означает элемент номер size и элемент номер 0. А до этого вы создали size элементов. Значит в этой строке вы пытаетесь получить элемент НЕ последний, а последний +1, а это выход за пределы массива. Т.е. если вы хотите получить получить последний элемент из массива размером size, то индекс должен быть size-1

Answer 2

heightMap[size, 0] — неправильно.

Поскольку вы создавали heightMap как new double[size,size], валидные индексы по обеим координатам от 0 до size - 1.

Соответственно, если вам нужен последний индекс, используйте size - 1.

READ ALSO
Как узнать грани Convex Mesh'a?

Как узнать грани Convex Mesh'a?

Можно ли узнать грани выпуклого меша (у которого Convex включен)? У обычного Меш коллайдера эту функцию прекрасно выполнял RaycastHittriangleIndex

248
XML сериализация/десириализация

XML сериализация/десириализация

Допустим, есть такой XML:

217
Усыпление потока, ожидание, продолжение

Усыпление потока, ожидание, продолжение

Выполняю множество последовательных get-запросовСлать запросы можно не чаще, чем через 340 мс

279
Переход между TextBox WPF

Переход между TextBox WPF

Есть два TextBox:

218