Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2965 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Où est l'erreur?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Où est l'erreur?

n°702654
gustifotz
Posté le 19-04-2004 à 11:54:44  profilanswer
 

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  ;) .

mood
Publicité
Posté le 19-04-2004 à 11:54:44  profilanswer
 

n°702657
antp
Super Administrateur
Champion des excuses bidons
Posté le 19-04-2004 à 12:04:33  profilanswer
 

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
n°702674
gustifotz
Posté le 19-04-2004 à 12:19:41  profilanswer
 

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.

n°702679
antp
Super Administrateur
Champion des excuses bidons
Posté le 19-04-2004 à 12:23:30  profilanswer
 

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
n°702733
myst78
Posté le 19-04-2004 à 13:35:43  profilanswer
 

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...
n°702736
xterminhat​e
Si vis pacem, para bellum.
Posté le 19-04-2004 à 13:37:17  profilanswer
 

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...
n°702742
myst78
Posté le 19-04-2004 à 13:39:16  profilanswer
 

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...
n°702764
gustifotz
Posté le 19-04-2004 à 14:05:19  profilanswer
 

Bon merci, au boulot...

n°703316
el muchach​o
Comfortably Numb
Posté le 19-04-2004 à 23:25:48  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Où est l'erreur?

 

Sujets relatifs
[Délestage][ASP.NET] erreur lors de l'install d'un starter kitErreur de code PHP/HTML/JAVASCRIPT
Erreur java.lang.OutOfMemory alors qu'il me reste de la RAM????[JBoss]Erreur de demarrage
[SQL] Erreur incompréhensible (insert into)Erreur Python : TypeError: 'file' object is not callable
erreur "In member function"message d'erreur pour debugger n'importe quand.
POST DE NB, php/mysql trouvez vous l'erreur dans le compteur? (resolu)erreur sur ma page ! aide svp
Plus de sujets relatifs à : Où est l'erreur?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR