错误消息“;索引在数组的边界之外”;

本文关键字:边界 消息 索引 错误 数组 | 更新日期: 2023-09-27 17:58:17

我有这个代码,当我运行它时,错误在new Program(int.Parse(args[0]));中,异常是

索引超出数组的范围

我的代码:

  using System;
using System.Threading.Tasks;
using System.Linq;
namespace MagicSquares
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length > 0)
        new Program(int.Parse(args[0]));
        }
        private int n;
        private int constant;
        private int[,] solution;
        public Program(int n)
        {
            this.n = n;
            int nSquared = n * n;
            int sumAllNumbs = nSquared * (nSquared + 1) / 2;
            constant = sumAllNumbs / n;
            int threads = Environment.ProcessorCount;
            Parallel.For(0, threads, (i) =>
            {
                Random rnd = new Random();
                int[] numbers = Enumerable.Range(1, nSquared).ToArray();
                int[,] square = new int[n, n];
                do
                {
                    RandomizeNumbers(rnd, numbers);
                    FillSquare(square, numbers);
                    if (IsMagicSquare(square))
                        solution = square;
                } while (solution == null);
            });
            PrintSquare(solution);
        }
        private void RandomizeNumbers(Random rnd, int[] numbers)
        {
            for (int i = numbers.Length - 1; i >= 0; i--)
            {
                int index = rnd.Next(numbers.Length);
                int temp = numbers[i];
                numbers[i] = numbers[index];
                numbers[index] = temp;
            }
        }
        private void FillSquare(int[,] square, int[] numbers)
        {
            int index = 0;
            for (int y = 0; y < n; y++)
                for (int x = 0; x < n; x++)
                {
                    square[y, x] = numbers[index];
                    index++;
                }
        }
        private bool IsMagicSquare(int[,] square)
        {
            //Check horizontal
            for (int y = 0; y < n; y++)
            {
                int sum = 0;
                for (int x = 0; x < n; x++)
                    sum += square[y, x];
                if (sum != constant)
                    return false;
            }
            //Check vertical
            for (int x = 0; x < n; x++)
            {
                int sum = 0;
                for (int y = 0; y < n; y++)
                    sum += square[y, x];
                if (sum != constant)
                    return false;
            }
            return true;
        }
        private void PrintSquare(int[,] square)
        {
            for (int y = 0; y < n; y++)
            {
                for (int x = 0; x < n; x++)
                    Console.Write(square[y, x] + " ");
                Console.WriteLine();
            }
        }
    }
}

错误消息“;索引在数组的边界之外”;

问题:您的错误清楚地"告诉"您正在访问args[0]索引零元素,但args数组没有元素。

解决方案:您需要将命令行参数传递给程序,并且在访问数组之前还需要确保存在元素,以避免运行时异常。

试试这个:

if(args.Length > 0)
  new Program(int.Parse(args[0]));

您可以通过以下方式之一传递命令行参数:

方法1:如果您从Visual Studio运行应用程序,您可以通过以下步骤传递命令行参数:

1.转到项目Properties
2.选择Debug选项卡
3.在CommanLine Arguments文本框中输入命令行参数

方法2:如果您使用从命令行运行应用程序,您可以通过以下命令传递命令行参数:

c:'MyPrograms'>MyApplication.exe 23

尝试检查args是否为空if(args.Length>0)

class Program
         {
            static void Main(string[] args)
             {
              if(args.Length>0)
             new Program(int.Parse(args[0]));
            }

args参数用于命令行参数。您可以在命令提示符下以yourexe <some integer>的形式运行您的程序,您将看到没有异常。或者,也可以通过visualstudio中的项目属性设置调试时要提供的命令行参数。