【问题标题】:C# IndexOutOfRangeExceptionC# IndexOutOfRangeException
【发布时间】:2012-01-15 13:26:39
【问题描述】:

在运行时程序说索引超出范围,但我不知道为什么。

错误消息指出的行是

Points[counter + ((int)(radius * 100))].X = i;

如果那个有错误,那么下一个(具有相同索引)也必须有错误。

Points[counter + ((int)(radius * 100))].Y = (Points[counter].Y * -1);

代码如下:

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

namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {
            Circle circle = new Circle(new Point2D(30F, 30F), 10F);
            foreach (Point2D point in circle.Points)
            {
                Console.Write(point.X + " = X\n" + point.Y + " = Y");
                Console.ReadKey();
            }
        }
    }

    public struct Point2D
    {
        public float X;
        public float Y;

        public Point2D(float x, float y)
        {
            this.X = x;
            this.Y = y;
        }
    }

    class Circle
    {
        public Point2D[] Points;
        float h, k;
        float radiusStart, radiusEnd;
        int counter;

        public Circle(Point2D location, float radius)
        {
            Points = new Point2D[(int)(radius * 201)];
            h = location.X;
            k = location.Y;
            radiusStart = h - radius;
            radiusEnd = h + radius;

            for (float i = radiusStart; i <= radiusEnd; i++)
            {
                Points[counter].X = i;
                Points[counter].Y = (float)(Math.Sqrt((radius * radius) - ((i - h) * (i - h))) + k);
                Points[counter + ((int)(radius * 100))].X = i;
                Points[counter + ((int)(radius * 100))].Y = (Points[counter].Y * -1);
                counter++;
            }

            counter = 0;
        }
    }
}

提前谢谢你

阿德里安·科拉多

【问题讨论】:

  • 你试过调试值吗?
  • 你真的应该再考虑一下这段代码。
  • 循环中的计数器值在哪里?您已将 counter 分配为 int 但没有任何值。
  • @Hoque:counter 是成员和值类型。 CLR 将其初始化为零。
  • @MatthewFerreira,非常感谢。

标签: c# arrays indexing geometry


【解决方案1】:

问题在于 for 循环的增量步骤:i = i++。它应该只是i++++i

i++ 递增 i 并返回其先前的值,然后您将再次将其分配回 i 。因此,i 实际上在循环的每次迭代中都以相同的值结束,因此它永远不会大于 radiusEnd,并且循环永远不会终止(直到计数器超过数组的上限并且您得到超出范围的异常)。

【讨论】:

    【解决方案2】:

    我看到了 i = i++ 的奇怪行为

    尝试将for (float i = radiusStart; i &lt;= radiusEnd; i = i++) 更改为仅使用i++ 而不是i = i++

    即使它不能解决您的问题,它也是更好的形式。

    【讨论】:

    • 我之前一定是不小心输入了 i = .. 感谢您的注意!
    【解决方案3】:

    我注意到“计数器”在您进入循环之前没有初始化,尝试将其初始化为 0 之前?

    【讨论】:

    • counter 是成员,CLR 保证为零。
    • 马修是对的。仍然是很好的做法,但这不是这里的问题。
    猜你喜欢
    • 2012-06-11
    • 1970-01-01
    • 2021-05-10
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多