Index se trouve en dehors des limites du tableau

Résolu
Hurobaki Messages postés 58 Statut Membre -  
 Utilisateur anonyme -
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

  1. Utilisateur anonyme
     
    Bonsoir, il faudrait montrer la déclaration et l'initialisation de NouvTab
    1
  2. Hurobaki Messages postés 58 Statut Membre
     
     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
  3. Utilisateur anonyme
     
    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