Озадачивающий индекс вне границ - PullRequest
5 голосов
/ 20 августа 2010

В моем коде есть раздел, где мне нужно инвертировать матрицу.Это может быть разумно сделано только на квадратной матрице, в данном случае на квадратной матрице 3х3.Инструмент, который я использую для инвертирования матрицы, постоянно повторял, что мой массив не был правильным квадратом.

Итак, я провел небольшой тест:

double[,] x = new double[3, 3];

MessageBox.Show(x.GetLength(0).ToString());
MessageBox.Show(x.GetLength(1).ToString());
MessageBox.Show(x.GetLength(2).ToString());

Первый выглядит как3" .Второй появляется как «3».Третий появляется как IndexOutOfRangeException.Я просто пропускаю что-то чрезвычайно очевидное или ... это немного странно?

(Примечание: это код из C # с использованием .Net 2.0)

Ответы [ 6 ]

11 голосов
/ 20 августа 2010

У вас есть только массив с двумя измерениями. Почему вы ожидаете, что запрос размера третьего измерения даст вам верный результат?

Метод Array.GetLength() возвращаетколичество элементов в указанном измерении массива.В вашем случае:

x.GetLength(2).ToString();   // asking for size of third dimension

вы спрашиваете двумерный массив, каков размер его третьего измерения.Результат - IndexOutOfRangeException.Это ожидаемое поведение.

В вашем примере кода похоже, что вы можете путать размер каждого указанного измерения с числом измерений. Вот несколько примеров прямоугольных массивовразных размеров:

var d1 = new int[5];     // one dimensional array, containing 5 elements
var d2 = new int[3,3];   // two-dimensional 3x3 element array
var d3 = new int[2,2,2]; // three-dimension array of 2x2x2 elements
var d4 = new int[2,5,6,8]; // four dimensional array, of 2x5x6x8 elements

Смотрите шаблон?Количество измерений определяется как сколько чисел вы указываете в объявлении массива.Размеры каждого измерения определяются значениями каждого числа в декларации.

4 голосов
/ 20 августа 2010

Ваша матрица имеет только 2 измерения, каждое из которых имеет длину 3 элемента. Третья строка MessageBox пытается вывести длину несуществующего третьего измерения.

3 голосов
/ 20 августа 2010

Просто для наглядного примера и предоставления ответа моими собственными словами ... (Сначала я не смог понять, почему также было выдано исключение):

double[,] x = new double[3, 3]; дает массив, которыйвыглядит следующим образом:

[0,0] [1,0] [2,0]
[0,1] [1,1] [2,1]
[0,2] [1,2] [2,2]

Я думал, что код пытается найти длину того, что можно рассматривать как подмассив, где каждая строка представляет массив, который в свою очередь является членом большего массива.

На самом деле строки сами по себе не являются массивами, а просто элементами (двойниками) исходного массива.Метод GetLength ищет размеры массива, а не длину (что может сбивать с толку, поскольку Length используется для определения количества элементов в массиве).Этот массив имеет два измерения, размер X и размер Y, если хотите.

Думайте о нем, как о плоском листе, который имеет два измерения.Если добавить третье:

double[,,] x = new double[3, 3, 3];

Лист становится кубом, добавляется новое измерение Z, и будет работать третье GetLength.

1 голос
/ 20 августа 2010
double[,,] x = new double[3, 3, 3];

MessageBox.Show(x.GetLength(0).ToString());
MessageBox.Show(x.GetLength(1).ToString());
MessageBox.Show(x.GetLength(2).ToString());
0 голосов
/ 20 августа 2010

Это может помочь вам визуализировать то, что было объяснено.

Ваш массив x, как вы объявили, выглядит так:

double[,] x = new double[3, 3];

Dimensions     0,1    0,1    0,1            
Element       [0,0], [0,1], [0,2]   
Element       [1,0], [1,1], [1,2]
Element       [2,0], [2,1], [2,2]
Lengths        3,3    3,3    3,3
0 голосов
/ 20 августа 2010

В вашем массиве не определены 3 измерения, поэтому вы можете получить только длину два.Ваш код запрашивает размеры куба, а не квадрата.

double[,] x = new double[3,3] // This sets up a two-dimensional array

MessageBox.Show(x.GetLength(0).ToString()); //Shows the length of the X axis
MessageBox.Show(x.GetLength(1).ToString()); //Shows the length of the Y axis
MessageBox.Show(x.GetLength(2).ToString()); //Trys to show the length of Z Axis.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...