C # IndexOutOfRangeException - PullRequest
       1

C # IndexOutOfRangeException

1 голос
/ 08 декабря 2011

Во время выполнения программа сообщает, что индекс находится вне диапазона, но я не знаю, почему.

Строка, на которую указывает сообщение об ошибке:

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;
        }
    }
}

Заранее спасибо

Адриан Колладо

Ответы [ 3 ]

3 голосов
/ 08 декабря 2011

Проблема в шаге увеличения вашего цикла for: i = i++.Это должно быть просто i++ или ++i.

i++ увеличивает i и возвращает его предыдущее значение, которое вы затем снова присваиваете обратно i.Следовательно, на самом деле я получаю одно и то же значение в каждой итерации цикла, поэтому оно никогда не больше, чем radiusEnd, и цикл никогда не завершается (пока счетчик не превысит верхнюю границу массива и вы не получите исключение вне диапазона).

2 голосов
/ 08 декабря 2011

Я видел странное поведение с: i = i++

Попробуйте изменить for (float i = radiusStart; i <= radiusEnd; i = i++), чтобы просто использовать i++ вместо i = i++.

Даже если это не решит вашу проблему, это намного лучшая форма.

2 голосов
/ 08 декабря 2011

Я заметил, что "counter" не инициализируется до того, как вы попадете в цикл, попробуйте инициализировать его до 0 раньше?

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