Où est l'erreur?

Où est l'erreur? - C++ - Programmation

Marsh Posté le 19-04-2004 à 11:54:44    

Salut les gens,
Je me galère avec un message d'erreur qui apparaît suite à l'exécution de ce prog, un truc genre "Impossible d'écrire en mémoire". Je comprends pas trop d'où ca vient puisque j'alloue de l'espace mémoire, tout bien quoi. Enfin je trouve que c'est tout bien mais ptêt que y a une erreur qui vous saute aux yeux et pas à moi.
Le prog sert à identifier les pixels contenus dans une forme quelconque, de contour noir, et à les colorier en rouge.

Code :
  1. void ChangeColor (int picwidth, int picheight, CDC* pDC)
  2. {
  3. int (*tab)[800] = new int[400][800];
  4. int right, left, up, down;
  5. for (int i = 0; i <= picheight; i++)
  6. {
  7.  for (int j = 0; j <= picwidth; j++)
  8.  {
  9.   if (pDC->GetPixel (j, i) == RGB (0, 0, 0))
  10.    tab [j][i] = 1;
  11.   else
  12.    tab [j][i] = 0;
  13.  }
  14.  for (int k = 0; k <= picwidth; k++)
  15.  {
  16.   for (int l = k+1; l <= picwidth; l++)
  17.    if (tab [l][i] == 1)
  18.    {
  19.     right = 1;
  20.     break;
  21.    }
  22.    else
  23.     right = 0;
  24.   for (int m = k-1; m >= 0; m--)
  25.    if (tab [m][i] == 1)
  26.    {
  27.     left = 1;
  28.     break;
  29.    }
  30.    else
  31.     left = 0;
  32.   for (int n = i-1; n >= 0; n--)
  33.    if (tab [k][n] == 1)
  34.    {
  35.     up = 1;
  36.     break;
  37.    }
  38.    else
  39.     up = 0;
  40.   for (int p = i+1; p <= picheight; p++)
  41.    if (tab [k][p] == 1)
  42.    {
  43.     down = 1;
  44.     break;
  45.    }
  46.    else
  47.     down = 0;
  48.  }
  49.  for (int q = 0; q <= picwidth; q ++)
  50.   if (right * left * up * down  == 1)
  51.    pDC->SetPixel (q, i, RGB (255, 0, 0));
  52. }
  53. delete [] tab;


 
Merci pour le coup de pouce  ;) .

Reply

Marsh Posté le 19-04-2004 à 11:54:44   

Reply

Marsh Posté le 19-04-2004 à 12:04:33    

après une lecture en 5 secondes, je dirais que c'est à cause de tes "<=" dans les for.
Si t'as une image de picwidth pixels de large, ça va de 0 à picwidth-1, donc il faut un "<" pour la comparaison.
Sinon ta déclaration « int (*tab)[800] = new int[400][800]; » me semble très étrange :heink:
j'aurais plutôt mis « int **tab = new int[400][800]; » (et ce 400 et 800 c'est quoi ?)


Message édité par antp le 19-04-2004 à 12:05:40

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 19-04-2004 à 12:19:41    

Ouais suis d'accord pour la déclaration de tab, mais si je déclare comme tu me le conseilles, voilà ce que je récupère :
"error C2440: 'initializing' : cannot convert from 'int (*)[800]' to 'int ** '
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast"  :(  
 
Idéalement, je voudrais allouer de la mémoire pour un tableau de dim picwidth x picheight mais pour l'instant je reste avec des images de 400 x 800.
Sinon j'ai remplacé les <= par des <, c'est vrai que c'était foireux ca, mais aucun changement, tjs une erreur l'exécution.
Je pense que je vais travailler avec un tableau à 1 dim, genre :
[cpp]int* pix = new int [picwidth * picheight];
 
 for (int i = 0; i <= picheight; i++)
 {
  for (int j = 0; j <= picwidth; j++)
  {
   if (pDC->GetPixel (j, i) == RGB (0, 0, 0))
    pix [j + picwidth * i] = 1;
   else
    pix [j + picwidth * i] = 0;
  }
 }
Merci pour ta réponse en tous les cas.

Reply

Marsh Posté le 19-04-2004 à 12:23:30    

ha ouais j'avais pas fait gaffe, en fait je ne sais pas trop comment on alloue en un coup des tableaux à plusieurs dimensions.
Le tableau à une dimension ça doit marcher, mais met quand même les "<" à la place des "<="


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 19-04-2004 à 13:35:43    

pour allouer un tableau a deux dimensions t'alloues d'abord un dimension, et ensuite tu fais une boucle pour alouer chaque case
genre ca :  
 

Code :
  1. int **tab = new int[picwidth]
  2. for(int i=0; i<picwidth; i++)
  3.     *(tab+i) = new int[picheight];


 
y'a peut etre des erreurs de syntaxe, mais le principe est la :)
 
a+


---------------
Fleur de métal, entité invulnérable, vêtue tant bien que mal, d'une muraille inébranlable...
Reply

Marsh Posté le 19-04-2004 à 13:37:17    

Ou sinon...

Code :
  1. std::vector<int> pix(0,picw*pixh);


Tu pourrais même optimiser ta boucle si GetPix ne prennait pas deux arguments, mais un seul comme pix[];
 
Cordialement,
   xter.


Message édité par xterminhate le 19-04-2004 à 13:37:40

---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 19-04-2004 à 13:39:16    

ah ouais pas pense au vecteur, bien vu ;)


---------------
Fleur de métal, entité invulnérable, vêtue tant bien que mal, d'une muraille inébranlable...
Reply

Marsh Posté le 19-04-2004 à 14:05:19    

Bon merci, au boulot...

Reply

Marsh Posté le 19-04-2004 à 23:25:48    

antp a écrit :

après une lecture en 5 secondes, je dirais que c'est à cause de tes "<=" dans les for.
Si t'as une image de picwidth pixels de large, ça va de 0 à picwidth-1, donc il faut un "<" pour la comparaison.
Sinon ta déclaration « int (*tab)[800] = new int[400][800]; » me semble très étrange :heink:
j'aurais plutôt mis « int **tab = new int[400][800]; » (et ce 400 et 800 c'est quoi ?)


 
Ces limites sont d'autant plus bizarres que si picwidth >=800 ou picheight>=400, il y a toute chance qu'il y ait un dépassement de tableau à un moment donné (ou alors je n'ai vraiment rien compris).
 
Sinon, pour allouer un tableau à n dimensions, il faut nécessairement préciser n-1 dimensions, parce que sinon, le compilateur ne saura pas faire l'arithmétique de pointeur nécessaire pour se déplacer dans le tableau. Dans la majorité des cas, l'utilisation des vecteurs, ou éventuellement de classes matrices ad'hoc, est plus simple (d'autant qu'il y a une belle fuite mémoire à la fin).


Message édité par el muchacho le 19-04-2004 à 23:34:07
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed