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 18279 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 mars 2023 - 11 déc. 2014 à 22:25
Whismeril Messages postés 18279 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 mars 2023 - 11 déc. 2014 à 22:25
A voir également:
- L'index se trouve en dehors des limites du tableau.
- Tableau croisé dynamique - Guide
- Afficher un tableau en c - Forum C
- Index of ✓ - Forum Téléchargement
- Notice: undefined index: - Astuces et Solutions
- Tableau ascii - Guide
3 réponses
Whismeril
Messages postés
18279
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 mars 2023
888
10 déc. 2014 à 20:59
10 déc. 2014 à 20:59
Bonsoir, il faudrait montrer la déclaration et l'initialisation de NouvTab
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
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 ...
Whismeril
Messages postés
18279
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 mars 2023
888
11 déc. 2014 à 22:25
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
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
Donc ton code fonctionnel est
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);
}
}
}