Member 11247684 Ответов: 4

Как решить индекс вне диапазона в C#


Дорогие все, я написал следующий фрагмент кода, чтобы заполнить популяцию размером 25 хромосомами, где каждая хромосома представляет собой матрицу размером 5*5, где каждый элемент в этой матрице будет либо 0, либо 1. Этот код для создания начальной популяции для генетического алгоритма :

using System;
using System.IO;
using System.Text;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Threading;
using AUV_Topology;
using System.Collections.Generic;
using System.Media;

namespace AUVtopology
{
    public partial class Form1 : Form
    {


static int[,] auvChromosomes;

static int[][,] population;

private void moveGenetic_Click(object sender, EventArgs e)
        {

            FileStream fs = new FileStream("C:/Users/Welcome/Desktop/intialPopulation.txt", FileMode.Append, FileAccess.Write);

            population = new int[25][,]; // jagged array

            Random rnd = new Random(); // to gereate random number (either 0 or 1)

            calculateCellsCenters(200, 325); // Compute all the center points (Xc,Yc) for all cells of the partitioned region (grid) 

            auvChromosomes = new int[5, 5];

            for (int i = 0; i < population.Length; i++)
            {

                population[i] = new int[5, 5];

            }

          using (StreamWriter sw = new StreamWriter(fs))

            {

                for (int i = 0; i < population.Length; i++)
                {

                    for (int j = 0; j < population[i].Length; j++)
                    {

                        for (int k = 0; k < auvChromosomes.Length; k++)
                        {


                            auvChromosomes[j, k] = rnd.Next(0, 2);

                            sw.Write("|" + auvChromosomes[j, k] + "|");


                        } // end-inner-for

                        sw.WriteLine();

                    } // end-outer-inner-for

                    sw.WriteLine("----------------------------------------------------------------------");

                } // end-outer-for

           


            } // end-using



            //Genetic_Algorithm(population);



        }

}// end-main-class

}// end-name-space



Я не знаю, где это нулевое исключение или индекс вне диапазона?? Я не вижу этого в своем коде, я думаю, что это правда !!

Почему я получил следующую ошибку, когда нажал на кнопку :

See the end of this message for details on invoking 
just-in-time (JIT) debugging instead of this dialog box.

************** Exception Text **************
System.IndexOutOfRangeException: Index was outside the bounds of the array.
   at AUVtopology.Form1.moveGenetic_Click(Object sender, EventArgs e) in C:\Users\Welcome\Desktop\project\GAAPS\AUV_Topology\Form1.cs:line 825
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ButtonBase.WndProc(Message& m)
   at System.Windows.Forms.Button.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


************** Loaded Assemblies **************
mscorlib
    Assembly Version: 4.0.0.0
    Win32 Version: 4.6.1648.0 built by: NETFXREL3STAGE
    CodeBase: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll
----------------------------------------
AUV_Topology
    Assembly Version: 1.0.0.0
    Win32 Version: 1.0.0.0
    CodeBase: file:///C:/Users/Welcome/Desktop/project/GAAPS/AUV_Topology/bin/Release/AUV_Topology.exe
----------------------------------------
System.Windows.Forms
    Assembly Version: 4.0.0.0
    Win32 Version: 4.6.1586.0 built by: NETFXREL2
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System
    Assembly Version: 4.0.0.0
    Win32 Version: 4.6.1647.0 built by: NETFXREL3STAGE
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Drawing
    Assembly Version: 4.0.0.0
    Win32 Version: 4.6.1586.0 built by: NETFXREL2
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
Accessibility
    Assembly Version: 4.0.0.0
    Win32 Version: 4.6.1586.0 built by: NETFXREL2
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/Accessibility/v4.0_4.0.0.0__b03f5f7f11d50a3a/Accessibility.dll
----------------------------------------
Microsoft.VisualBasic.PowerPacks.Vs
    Assembly Version: 10.0.0.0
    Win32 Version: 10.0.30319.1
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/Microsoft.VisualBasic.PowerPacks.Vs/10.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualBasic.PowerPacks.Vs.dll
----------------------------------------
Microsoft.VisualBasic
    Assembly Version: 10.0.0.0
    Win32 Version: 14.6.1586.0 built by: NETFXREL2
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/Microsoft.VisualBasic/v4.0_10.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualBasic.dll
----------------------------------------

************** JIT Debugging **************
To enable just-in-time (JIT) debugging, the .config file for this
application or computer (machine.config) must have the
jitDebugging value set in the system.windows.forms section.
The application must also be compiled with debugging
enabled.

For example:

<configuration>
    <system.windows.forms jitDebugging="true" />
</configuration>

When JIT debugging is enabled, any unhandled exception
will be sent to the JIT debugger registered on the computer
rather than be handled by this dialog box.


Примечание : Строка 825 находится в этом заявлении :

FileStream fs = new FileStream("C:/Users/Welcome/Desktop/intialPopulation.txt", FileMode.Append, FileAccess.Write);


Но когда я очищаю решение, перестраиваю проект и запускаю отладчик ... он указывает на следующее утверждение :

auvChromosomes[j, k] = rnd.Next(0, 2);


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

Мне нужно правильно напечатать начальную популяцию, где каждая хромосома представляет собой матрицу размером 5 * 5 ...

ZurdoDev

Просто отладьте его, и вы увидите, что именно происходит.

[no name]

Эта строка кода не может генерировать такое сообщение об ошибке. Вам все еще нужно научиться использовать отладчик для отладки вашего кода.

4 Ответов

Рейтинг:
34

Richard MacCutchan

for (int k = 0; k < auvChromosomes.Length; k++)

Длина (auvChromosomes.Length)- это общая длина массива, которая равна 5 х 5, то есть 25, но каждый индекс работает только от 0 до 4. Кроме того вы заселяетесь auvChromosomes каждый раз, а не каждый элемент в вашем population массив.


Member 11247684

Да, я починил его, и теперь он работает на меня

Рейтинг:
1

Patrice T

Цитата:
Но когда я очищаю решение, перестраиваю проект и запускаю отладчик

Вы должны оттачивать свои навыки в отладке.
При возникновении ошибки отладчик позволяет проверять переменные.
Проверьте значения i, j, k и размеры массива.
вы увидите, что вы пытаетесь записать в массив в месте, которое не существует.


Рейтинг:
0

OriginalGriff

Ошибка довольно явная: я не думаю, что она находится на той линии, о которой вы думаете. В VS CTRL+G позволит вам непосредственно перейти к строке, но лучший способ-запустить ваш код в отладчике и точно увидеть, что происходит.
На первый взгляд, если это строка 825 нужного файла, то у вас есть ошибки компиляции, которые помешали вам запустить "последний" код, и в результате номер строки ошибки не соответствует коду, на который вы смотрите.

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

Но без этого мы не сможем помочь!


Member 11247684

после следования совету ur исключение at : auvChromosomes[j, k] = rnd. Next(0, 2);

OriginalGriff

Итак, какие значения у вас есть в j и k-вам скажет отладчик.
Один (или оба) слишком велик - и это вызывает ошибку.
Затем вы можете оглянуться назад в своем коде, чтобы увидеть, почему он слишком велик.

Member 11247684

Почему??

Рейтинг:
0

Jochen Arndt

Видеть Массив.Свойство Длины (Система)[^]:

Цитата:
Возвращает общее количество элементов во всех измерениях массива.
Значит, ты считаешь j и k до 25.

Воспользуйся GetUpperBound() для соответствующего измерения или постоянного значения 5 вместо этого.