运行时错误:索引超出范围异常未处理

时间:2010-12-24 15:19:34

标签: c# winforms algorithm

在下面的代码中我想实现floyd算法,用户在文本框中输入一些数字,输出应该是从节点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 个答案:

答案 0 :(得分:2)

大多数编程语言,包括C#,都从位置0开始计算数组单元格。

这意味着如果您有一个大小为N的数组,则会得到从0到N-1的索引。

所以你的循环应该是这样的:

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

AND,当我再次查看代码时,我意识到你intValues是一个2D矩阵,每边的大小为matrixDimention。但是n的大小(int)Math.Pow(matrixDimention,2)。

因此,如果您在k通过intValues时尝试访问matrixDimention,那么您将会超出界限。

答案 1 :(得分:2)

你的matrixDimention用于初始化intValues,但你使用int n = (int)Math.Pow(matrixDimention, 2);迭代矩阵,你应该在for循环中使用matrixDimention:

for (int k = 0; k < matrixDimention; k++)
 ...