2015-01-30 1 views
0

У меня есть этот код:Как я могу найти, что делает исключение: IndexOutOfRangeException?

private void FindPoints() 
{ 
    try 
    { 
     GraphicsPath gp = new GraphicsPath(); 
     int x, y, p, j, wdthHght; 
     int bytes; 
     byte[] rgbValuesWithClouds; 
     byte[] rgbValuesWithoutClouds; 
     IntPtr ptr; 
     Rectangle rect; 
     BitmapData bitmap_Data; 

     Bitmap bmpWithClouds; //No memory is allocated 
     Bitmap bmpWithoutClouds; //No memory is allocated 

     gp.AddEllipse(new RectangleF(73, 72, 367, 367)); 

     using (bmpWithClouds = new Bitmap(mymem)) 
     { 
      rect = new Rectangle(0, 0, bmpWithClouds.Width, bmpWithClouds.Height); 
      wdthHght = bmpWithClouds.Width; 
      bitmap_Data = bmpWithClouds.LockBits(rect, ImageLockMode.ReadWrite, bmpWithClouds.PixelFormat); 
      ptr = bitmap_Data.Scan0; 
      bytes = bitmap_Data.Stride * bmpWithClouds.Height; 

      rgbValuesWithClouds = new byte[bytes]; 

      System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValuesWithClouds, 0, bytes); 

      bmpWithClouds.UnlockBits(bitmap_Data); 
     } 

     su = System.IO.Directory.GetCurrentDirectory(); 
     using (bmpWithoutClouds = new Bitmap(su + "\\WithoutClouds.bmp")) //24 bit bitmap 
     { 
      rect = new Rectangle(0, 0, bmpWithoutClouds.Width, bmpWithoutClouds.Height); 

      bitmap_Data = bmpWithoutClouds.LockBits(rect, ImageLockMode.ReadWrite, bmpWithoutClouds.PixelFormat); 
      ptr = bitmap_Data.Scan0; 
      bytes = bitmap_Data.Stride * bmpWithoutClouds.Height; 

      rgbValuesWithoutClouds = new byte[bytes]; 
      System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValuesWithoutClouds, 0, bytes); 
      bmpWithoutClouds.UnlockBits(bitmap_Data); 
     } 
     cloudPoints = new List<Point>(); 

     for (y = 0; y < wdthHght; y++) 
     { 
      j = 0; 
      for (x = 0; x < wdthHght; x++) 
      { 
       p = y * wdthHght * 3 + j; 
       if (rgbValuesWithClouds[p] != rgbValuesWithoutClouds[p]) 
       { 
        cloudPoints.Add(new Point(x, y)); 
       } 

       j += 3; 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     MessageBox.Show(e.ToString()); 
    } 
} 

Исключение составляет от номера строки 393:

if (rgbValuesWithClouds[p] != rgbValuesWithoutClouds[p]) 

я попробовать и поймать, но я не могу видеть, что значения p и rgbValuesWithClouds и rgbValuesWithoutClouds есть.

А также что может сделать это исключение?

System.IndexOutOfRangeException был пойман HResult = -2146233080 Message = Индекс находился вне границ массива. Источник = Моя метеостанция StackTrace: at mws.ScanningClouds.FindPoints() в d: \ C-Sharp \ Download File \ Download-File-Project-Version-012 \ Загрузка файла \ ScanningClouds.cs: строка 393 InnerException :

+1

Возможно, вы захотите сравнить 'p' с размером' bytes', посмотреть на шаг и т. Д. Вы говорите, что не видите значения 'p' и т. Д. - не отображаются ли они в отладчике? –

+1

Установите точку останова в строке 392 (эта строка: p = y * wdthHght * 3 + j;) и запустите в режиме отладки, теперь найдите значение p, а затем значение rgbValuesWithClouds.length (размер байта array rgbValuesWithClouds) и rgbValuesWithoutClouds.length (размер байтового массива rgbValuesWithoutClouds). Это должно предоставить больше информации. –

+1

[Отлаживайте этот код для меня вопросы] (http://meta.stackexchange.com/questions/125384/debug-this-code-for-me-questions) – MickyD

ответ

1

вы уже знаете, что у вас есть IndexOutOfRangeException в линии

if (rgbValuesWithClouds[p] != rgbValuesWithoutClouds[p]) 

, что означает, что p либо меньше 0 или больше, чем длина rgbValuesWithClouds или rgbValuesWithoutClouds.

Возможно, вы захотите проверить, больше или меньше p, чем 0, и меньше, чем длина обоих ваших массивов, прежде чем вы сделаете это сравнение.

Смежные вопросы