System.Indexoutofrangeexception错误未被理解

时间:2016-07-21 16:20:02

标签: c# matrix indexoutofrangeexception

您好我是c#的初学者,我不明白为什么在下面显示的程序中抛出异常

方案:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            int n, i, x=0, y=0;
            Console.WriteLine("Enter the degree of matrix:");
            n = int.Parse(Console.ReadLine());
            int[,] num = new int[n, n];
            int p = n * n;
            for (i = 1; i <= p; i++)
            {
                num[x, y] = i;
                if (num[x, y] % n == 0) { y++; }
                if (y % 2 == 0) { x++; }
                if (y % 2 != 0) { x--; }
            }
            for (i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    Console.Write(num[i, j] + " ");
                }
                Console.WriteLine();
            }
            Console.ReadLine();
        }
    }
}

必修结果:

Enter order of matrix:
4

1 8 9  16
2 7 10 15
3 6 11 14 
4 5 12 13

但是在num [x,y] = i中抛出了主题中所述的异常; 。我不明白为什么发生System.IndexOutOfRangeException,因为循环明确地在2d数组的末尾结束。

P.S。该程序只能运行一次。

3 个答案:

答案 0 :(得分:0)

也许我错了,但是如果你插入2作为矩阵的度数,那么变量p等于4。

外部循环

for (i = 1; i <= p; i++)

循环4次,从1到4.但是当i == 4时,X等于-1,并且您无法访问具有负索引的矩阵。你会得到与degree = 4相同的行为,就像你的例子一样。

答案 1 :(得分:0)

您不能在更改x值的同一循环迭代中更改y值,因为这样做,您不会填充第二列中的最后一个位置并随后迭代低至x = -1这是一个无效的索引。

    for (i = 1; i <= p; i++)
    {
        num[x, y] = i;
        if (i % n == 0) { 
            y++; 
        }
        else {
            if (y % 2 == 0) { x++; }
            if (y % 2 != 0) { x--; }
        }
    }
    for (i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            Console.Write(num[i, j] + " ");
        }
        Console.WriteLine();
    }

答案 2 :(得分:0)

你可以尝试一下......

你犯了一个基本的错误,这里x是在y增量时递减,使用继续语句跳过循环后y,我保证这个工作100%

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace StackOverflow
{
    class Program
    {
        static void Main(string[] args)
        {
            int n, i, x = 0, y = 0;
            Console.WriteLine("Enter the degree of matrix:");
            n = int.Parse(Console.ReadLine());
            int[,] num = new int[n, n];
            int p = n * n;
            for (i = 1; i <= p; i++)
            {
                try
                {
                    num[x, y] = i;
                    if (num[x, y] % n == 0) { y++; continue; }
                    if (y % 2 == 0) { x++; }
                    if (y % 2 != 0) { x--; }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                }
            }
            for (i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    Console.Write(num[i, j] + " ");
                }
                Console.WriteLine();
            }
            Console.ReadLine();
        }
    }
}