Index se trouve en dehors des limites du tableau

Résolu/Fermé
Hurobaki Messages postés 53 Date d'inscription dimanche 23 mars 2014 Statut Membre Dernière intervention 10 mars 2017 - Modifié par Hurobaki le 10/12/2014 à 19:34
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 - 11 déc. 2014 à 22:25
Bonjour à tous !

J'ai un problème avec l'un de mes tableaux en c# je tente de chercher la plus grande valeur ( vous me direz que c'est simple, je le pensais aussi ...) mais j'ai cette erreur "Index se trouve en dehors des limites du tableau" qui persiste pourtant je ne vois pas d'où vient mon erreur !

 

int i, j , k, seuil = 74;

 int VoteRho=0, VoteTheta=0;

double theta,rho;

 double max = 0,RhoMax = Math.Sqrt(434*434+342*342);

double[,] Hough = new double [(int)RhoMax,360];


for (j = 2; j <= 342-1; j++)
            {
                for (k = 2; k <= 434-1; k++)
                {
                    if (NouvTab[j, k] == 0)
                    {
                        for (double angle = 0; angle <= 360; angle++)
                        {
                            theta = angle * Math.PI / 180;
                            rho = (k * Math.Cos(theta)) + (j * Math.Sin(theta));
                            if (rho >= 0)
                            {
                                Hough[(int)rho, (int)theta]++;
                            }
                        }
                    }
                }
            }

 
            for (i = 0; i <= Hough.Length-1; i++)
            {
                for (j = 0; j<= RhoMax-1; j++)
                {
                    if (Hough[i, j] > max)
                    {
                        max = Hough[i, j];
                        VoteRho = i;
                        VoteTheta = j;
                    }      
                }  
            }


J'ai pourtant fait -1 sur la longueur totale des boucle for, je ne vois pas d'où vient mon erreur.

J'espère trouver quelqu'un qui puisse m'aider !

Merci d'avance !

3 réponses

Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 931
10 déc. 2014 à 20:59
Bonsoir, il faudrait montrer la déclaration et l'initialisation de NouvTab
1
Hurobaki Messages postés 53 Date d'inscription dimanche 23 mars 2014 Statut Membre Dernière intervention 10 mars 2017
11 déc. 2014 à 10:32
 public void Calcul()
        {
            //Les Variables
            int i, j , k, seuil = 74;
            int VoteRho=0, VoteTheta=0;
            double theta,rho;
            double RhoMax = Math.Sqrt(434*434+342*342);
            double max=0;
           


            // Les Tableaux 
            byte[] MonTableau = new byte[434 * 342]; // Tableau 1 dimension qui va servir à mettre l'ensemble des pixels de l'image puis à binariser
            byte[,] NouvTab = new byte[342, 434]; //Tableau 2 dimensions qui sert à stocker le tableau 1D binariser et ensuite on va le parcourir pour faire Hough
            double[,] Hough = new double [(int)RhoMax,360]; //Tableau de Hough où les votes sont comptabilisés


            MonImage.CopyPixels(MonTableau, 434, 0);

            //Binarisation 
            for (i = 0; i <= MonTableau.Length-1; i++)
            {
                if (MonTableau[i] > seuil)
                {
                    MonTableau[i] = 255;
                }
                else
                {
                    MonTableau[i] = 0;
                }
            }
            

            for (i = 0; i <= MonTableau.Length-1; i++)
            {
                NouvTab[i / 434, i % 434] = MonTableau[i];
            }

            //Etape n°2

            for (j = 2; j <= 342-1; j++)
            {
                for (k = 2; k <= 434-1; k++)
                {
                    if (NouvTab[j, k] == 0)
                    {
                        for (double angle = 0; angle <= 360; angle++)
                        {
                            theta = angle * Math.PI / 180;
                            rho = (k * Math.Cos(theta)) + (j * Math.Sin(theta));
                            if (rho >= 0)
                            {
                                Hough[(int)rho, (int)theta]++;

                            }
                        }
                    }
                }
            }

// Partie qui génère l'erreur 
            for (int x = 0; x <= RhoMax - 1; x++)
            {
                for (int y = 0; y <= (Hough.Length)-1; y++)
                {
                   

                    
                   if (Hough[x,y]>max)
                    {
                        max = Hough[x, y];
                        VoteRho = x;
                        VoteTheta = y;
                        MessageBox.Show(" " +max +" " +x);
                    }      
                }  
            }



J'ai remarqué que x ne s'incrémente pas ...
0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 931
11 déc. 2014 à 22:25
Bonsoir, tout d'abord quand on fait une boucle avec une collection et le nombre d'éléments (tableau, List, etc...) on n'utilise pas <= quelque chose -1 mais < quelque chose
Par exemple
            for (int x = 0; x < RhoMax; x++)


Ensuite au moment ou ça plante, on constate que y vaut 360, or quand on passe la souris sur Hough, on voit Hough = {double[552, 360]}, donc effectivement l'index 360 est en dehors de la deuxième dimension du tableau.

Par contre quand on regarde Hough.Lenght on voit Hough.Length = 198720 et donc 360 est bien inférieur à cette valeur, donc la boucle l'a atteinte.
On constate que 552 * 360 = 198 720, ce qui est logique puisque Length retourne le nombre d'éléments dans le tableau.

Ce n'est donc pas Length qui doit te servir dans ce cas, mais GetUpperBound.
Ceci
Hough.GetUpperBound(1)
retourne 359, et là tu devras mettre un <= car c'est le dernier index.

Donc ton code fonctionnel est
            for (int x = 0; x < RhoMax; x++)
            {
                for (int y = 0; y <= Hough.GetUpperBound(1); y++)
                {
                   

                    
                   if (Hough[x,y]>max)
                    {
                        max = Hough[x, y];
                        VoteRho = x;
                        VoteTheta = y;
                        MessageBox.Show(" " +max +" " +x);
                    }      
                }  
            }
0