Member 13341679 Ответов: 2

Как решить эту ошибку "индекс находился за пределами массива"?


Я работаю над проектом обработки изображений и попытался написать код для фильтра нерезкой маски. Я использую C#.Net и против 2012 года. Здесь я хочу вычесть два массива, но эта ошибка возникает во время выполнения. Кто-нибудь может пожалуйста помочь мне выбраться отсюда.
Заранее спасибо.

Что я уже пробовал:

int[] Oarray = new int[] { r, g, b };

int[] Rarray = new int[3];//Index was outside the bounds of the array.

newBitmap = (Bitmap)pictureBox1.Image;
for (int i = 0; i < newBitmap.Width; i++)
{
for (int j = 0; j < newBitmap.Height; j++)
{

Color p = newBitmap.GetPixel(i, j);

int r1 = p.R;
int g1 = p.G;
int b1 = p.B;

int[] newarray = new int[] { r1, g1, b1 };

for (int n = 0; n <= Rarray.Length; n++)
Rarray[n] = Oarray[n] - newarray[n];//Index was outside the bounds of the array.

2 Ответов

Рейтинг:
19

Patrice T

Попробуйте заменить

for (int n = 0; n <= Rarray.Length; n++)

с
for (int n = 0; n < Rarray.Length; n++)

C / C++/C# основаны на нуле. Массив размера 3 имеет элементы от 0 до 2.


Member 13341679

@ppolymorphe спасибо.

Рейтинг:
1

OriginalGriff

Компиляция не означает, что ваш код верен! :смеяться:
Подумайте о процессе разработки как о написании письма: успешная компиляция означает, что вы написали письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но к более ранним стадиям вы придете позже): тестирование и отладка.

Начните с рассмотрения того, что он делает и чем это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а он удваивает его и печатает ответ, то если ввод / вывод был таким:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его-он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он где-то здесь:
private int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить почему. Поставить точку останова на строке:
myaverage.DisplayAverage();

и запустите свое приложение. Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она на самом деле делала, когда вы использовали кнопку "шаг вперед" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?

Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он совершенствуется только при использовании!