2011-12-08 7 views
1

Lors de l'exécution, le programme indique qu'un index est hors limites, mais je ne sais pas pourquoi.C# IndexOutOfRangeException

La ligne que l'erreur fait messager est sur

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

Si que l'on a une erreur, la suivante (avec le même indice) doit également avoir une erreur.

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

Voici le code:

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

Nous vous remercions à l'avance

Adrian Collado

+0

avez-vous essayé de déboguer la valeur? –

+2

Vous devriez vraiment réfléchir à nouveau sur ce code. – Jon

+0

Où est la valeur du compteur dans la boucle? Vous avez affecté counter comme int mais sans aucune valeur. – Hoque

Répondre

2

J'ai vu un comportement bizarre avec: i = i++

Essayez de changer for (float i = radiusStart; i <= radiusEnd; i = i++) simplement utiliser i++ au lieu de i = i++.

Même s'il ne résout pas le problème, il est bien meilleur.

+0

Je dois avoir accidentellement tapé i = avant .. Merci de l'avoir remarqué! –

2

Je remarque que "contre" n'est pas initialisé avant de monter dans la boucle , essayez de l'initialiser à 0 avant?

+1

'counter' est un membre, garanti à zéro par le CLR. –

+0

Matthew a raison. Toujours bonne pratique, mais ce n'est pas le problème ici. –

3

Le problème est dans l'étape d'incrément de votre boucle for: i = i++. Il devrait simplement être i++ ou ++i.

i++ incrémente i et renvoie sa valeur précédente que vous affectez à nouveau à i. Par conséquent, je finis avec la même valeur à chaque itération de la boucle, donc elle n'est jamais supérieure à radiusEnd, et la boucle ne se termine jamais (jusqu'à ce que compteur dépasse la limite supérieure du tableau et que vous obteniez une exception hors plage).

Questions connexes