ошибка времени выполнения: исключение индекса вне диапазона было обработано - PullRequest
2 голосов
/ 24 декабря 2010

В приведенном ниже коде я хочу реализовать алгоритм Флойда, пользователь вводит несколько чисел в текстовое поле, и на выходе должны быть кратчайшие расстояния, которые могут пройти от узла i до узла j.но когда я набираю, например, 4 числа, это дает пробегошибка времени: вне диапазона в строке, которую я прокомментировал ниже, и я отладил ее, я понял, что k, я просто принимаю 1 значение и не принимаю другие значения, меньшие, чем n + 1, но j может принимать все значения меньше, чем n +1, что я могу решить эту проблему? Большое спасибо

отредактировано: спасибо за ваши ответы, я исправил это

 private void button10_Click(object sender, EventArgs e)
 {

    string ab = textBox11.Text;

    int matrixDimention = Convert.ToInt32(ab);

    int[,] intValues = new int[matrixDimention, matrixDimention];

    string[] splitValues = textBox9.Text.Split(',');

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

        intValues[i / (matrixDimention), i % (matrixDimention)] = Convert.ToInt32(splitValues[i]);
    string displayString = "";

    for (int inner = 0; inner < intValues.GetLength(0); inner++)
    {
        for (int outer = 0; outer < intValues.GetLength(0); outer++)

            displayString += String.Format("{0}\t", intValues[inner, outer]);

        displayString += Environment.NewLine;
    }
   int n=matrixDimension

    MessageBox.Show("matrix"+strn+ "in" + strn + "is\n\n\n" +displayString);

////before this line i wrote the codes to get the numbers that user enter in textbox and put it in an 2d array
    for (int k = 0; k < n; k++)/// k just take 1 in debugging!!!

        for (int i = 0; i < n; i++)///i just take 1 in debugging!!!

            for (int j = 0; j < n; j++)///j took the values true

       /*i took that error on this line  */ if (intValues[i, j] > intValues[i, k] + intValues[k, j])
                {
                    intValues[i, j] = intValues[i, k] + intValues[k, j];

                    string str_intvalues = intValues[i, j].ToString();

                    MessageBox.Show("Shortest Path from i to j is: " + str_intvalues);

                }
                else
                {
                    string str_intvalues = intValues[i, j].ToString();
                    MessageBox.Show("Shortest Path from i to j is: " + str_intvalues);

                }
}

Ответы [ 2 ]

2 голосов
/ 24 декабря 2010

ваш matrixDimention используется для инициализации intValues, но вы используете int n = (int)Math.Pow(matrixDimention, 2); для итерации по вашей матрице, вам просто нужно использовать matrixDimention в ваших циклах for:

for (int k = 0; k < matrixDimention; k++)
 ...
2 голосов
/ 24 декабря 2010

Большинство языков программирования, включая C #, начинают считать ячейки массива с позиции 0.

Это означает, что если у вас есть массив размера N, вы получите индексы от 0 до N-1.

Так что все ваши циклы должны выглядеть следующим образом:

for (int j = 0; j < n; j++)

И, когда я снова посмотрел на код, я понял, что вы intValues - это двумерная матрица с размером matrixDimention с каждой стороны.,НО n имеет размер (int) Math.Pow (matrixDimention, 2).

Так что если вы попытаетесь получить доступ к intValues, когда k пройдет matrixDimention, вы выйдете за пределы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...