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

  FORUM HardWare.fr
  Programmation
  C++

  erreur dans une boucle

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

erreur dans une boucle

n°176672
lordankou
Posté le 15-07-2002 à 21:36:41  profilanswer
 

j'ai pas tout mis le programme là car ça serait inutile. l'erreur provient de l'initialisation du tableau à 2d quand il essaie d'affecter une valeur.
 
#define largeur 800
#define hauteur 600
 
int main(int argc, char *argv[])
{  
int matrice [80][60] ;
int i = 0 ;
int j = 0 ;
 
// initialisation de la matrice
while (i < hauteur)
{
  while ( j < largeur)
    {
        if ((nombre_aleatoire= rand()) < (32767/3))
        matrice[i][j] = 1 ;
        else
        matrice[i][j] = 0 ;
        i++;
        j++;
    }
};
 
}
 
 
et le message donne : le programme a effectué une erreur... nous vous prions de nous.... (message d'erreur sous XP)


---------------

mood
Publicité
Posté le 15-07-2002 à 21:36:41  profilanswer
 

n°176675
verdoux
And I'm still waiting
Posté le 15-07-2002 à 21:38:39  profilanswer
 

Ben oui normal.

n°176677
Alload
Posté le 15-07-2002 à 21:44:22  profilanswer
 

Regardes du coté des defines et de la taille de ta matrice.
:)
 
Encore un truc, c'est normal que i et j soient incrémentés dans la même boucle? Edit: enfin ce que je veux dire, c'est que tu t'es pas trompé (on sait jamais :))?


Message édité par Alload le 15-07-2002 à 21:44:55
n°176678
lordankou
Posté le 15-07-2002 à 21:46:13  profilanswer
 

dans la famille con je demande lordankou. alors là j'ai vraiment pas fait attention sur ce coup là. en plus elle est big big l'erreur. ça fait même tache.  :(  :(  
merci


---------------

n°176680
Alload
Posté le 15-07-2002 à 21:49:21  profilanswer
 

Code :
  1. if ((nombre_aleatoire= rand()) < (32767/3))


 
Pourquoi tu mets la valeur retournée par rand() dans une autre variable? Je pense pas que tu utilises nombre_aleatoire à la vue de ton code, oubien?

n°176686
lordankou
Posté le 15-07-2002 à 22:00:52  profilanswer
 

je compte l'utilisais dans une autre version. là je commence progressivement car je teste deux chose à la fois : l'openGL et le jeu de la vie en incluant un système d'évolution.


---------------

n°176690
smaragdus
whores, drugs & J.S. Bach
Posté le 15-07-2002 à 22:11:18  profilanswer
 

lordankou a écrit a écrit :

je compte l'utilisais dans une autre version. là je commence progressivement car je teste deux chose à la fois : l'openGL et le jeu de la vie en incluant un système d'évolution.




 
si tu veux remplit ton tableau uniformement avec des 0 ou 1, tu t'y prends mal car tu ne parcours pas le tableau en entier.
 

Code :
  1. // initialisation de la matrice  
  2. for(int i=0; i < hauteur; i++)
  3.    for(int j=0; j < largeur; j++)
  4.        matrice[j][i] = ((nombre_aleatoire= rand()) < (32767/3)) ? 1 : 0 ;

n°176758
Musaran
Cerveaulté
Posté le 16-07-2002 à 02:34:31  profilanswer
 

Mettons un peu d'ordre la-dedans

Code :
  1. const int largeur = 800 ;
  2. const int hauteur = 600 ;
  3. int main(){ 
  4. int matrice [largeur][hauteur] ;
  5. // initialisation de la matrice
  6. for(int i=0 ; i < hauteur ; i++){
  7.  for(int j=0 ; j < largeur ; j++){
  8.   matrice[i][j] = rand() < (32767/3) ? 1 : 0 ;
  9.  }
  10. }
  11. return 0 ;
  12. }


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°176786
Carbon_14
Posté le 16-07-2002 à 09:09:14  profilanswer
 

C'est plus clair et évite les fautes de frappe du genre
 
#define largeur 800
#define hauteur 600
 
int matrice [80][60];
 
les bornes de la boucle sont à 800, 600 mais les dimensions 80, 60...  

n°177134
lordankou
Posté le 16-07-2002 à 15:19:49  profilanswer
 

quand je remplis la matrice comme suit :  
 

Code :
  1. #include <windows.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <gl\gl.h>
  5. #include <gl\glut.h>
  6. #define largeur 800
  7. #define hauteur 600
  8. int const largeur_matrice = largeur/10 ;
  9. int const hauteur_matrice = hauteur/10 ;
  10. void Display();
  11. void Dessiner_carre();
  12. void Reshape(int, int);
  13. int matrice [largeur_matrice][hauteur_matrice] ;
  14. int main(int argc, char *argv[])
  15. {
  16. int i = 0 ;
  17. int j = 0 ;
  18. // initialisation de la matrice
  19. while (i < hauteur_matrice)
  20. {
  21.   while ( j < largeur_matrice)
  22.     {
  23.         matrice[i][j] = rand() < (32767/3) ? 1 : 0 ;
  24.         j++;
  25.     }
  26.   i++;
  27.   j=0;
  28. };
  29. .
  30. .
  31. .
  32. };


il remplit bien la matrice mais à chaque fois de la même manière (2346 fois il y a un 1).
 
mais quand je fais dans une autre fonction :  
 

Code :
  1. void Display()
  2. {
  3. glClearColor(0,0,0,0);
  4. glClear(GL_COLOR_BUFFER_BIT); // init frame buffer
  5. int i = 0 ;
  6. int j = 0 ;
  7. int nombre = 0 ;
  8. while (i < hauteur_matrice)
  9. {
  10.   while ( j < largeur_matrice)
  11.     {
  12.       if ((matrice[i][j])=1)
  13.         {
  14.           nombre++;
  15.           glBegin(GL_QUADS);
  16.             glVertex2d(0-6.5,0+5);
  17.             glVertex2d(0-6.5+0.1,0+5);
  18.             glVertex2d(0-6.5+0.1,0+5-0.1);
  19.             glVertex2d(0-6.5,0+5-0.1);
  20.           glEnd();
  21.           j++;
  22.           glFlush();
  23.         }
  24.     }
  25.   i++;
  26.   j=0;
  27. };
  28. printf("nombre : %d", nombre);
  29. };


 
 
il m'indique alors 4800 1 c'est à dire toute la matrice remplie de 1.
ce qui n'est pas logique car précédemment il y a que 2346 1.


Message édité par lordankou le 16-07-2002 à 15:21:50

---------------

mood
Publicité
Posté le 16-07-2002 à 15:19:49  profilanswer
 

n°177140
smaragdus
whores, drugs & J.S. Bach
Posté le 16-07-2002 à 15:25:31  profilanswer
 

C'est une blague ou quoi ?
 

Code :
  1. matrice[i][j]) == 1


 

n°177142
JeSuisPasU​nNumero
Posté le 16-07-2002 à 15:26:08  profilanswer
 

lordankou a écrit a écrit :

quand je remplis la matrice comme suit :  
 

Code :
  1. #include <windows.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <gl\gl.h>
  5. #include <gl\glut.h>
  6. #define largeur 800
  7. #define hauteur 600
  8. int const largeur_matrice = largeur/10 ;
  9. int const hauteur_matrice = hauteur/10 ;
  10. void Display();
  11. void Dessiner_carre();
  12. void Reshape(int, int);
  13. int matrice [largeur_matrice][hauteur_matrice] ;
  14. int main(int argc, char *argv[])
  15. {
  16. int i = 0 ;
  17. int j = 0 ;
  18. // initialisation de la matrice
  19. while (i < hauteur_matrice)
  20. {
  21.   while ( j < largeur_matrice)
  22.     {
  23.         matrice[i][j] = rand() < (32767/3) ? 1 : 0 ;
  24.         j++;
  25.     }
  26.   i++;
  27.   j=0;
  28. };
  29. .
  30. .
  31. .
  32. };


il remplit bien la matrice mais à chaque fois de la même manière (2346 fois il y a un 1).
 
mais quand je fais dans une autre fonction :  
 

Code :
  1. void Display()
  2. {
  3. glClearColor(0,0,0,0);
  4. glClear(GL_COLOR_BUFFER_BIT); // init frame buffer
  5. int i = 0 ;
  6. int j = 0 ;
  7. int nombre = 0 ;
  8. while (i < hauteur_matrice)
  9. {
  10.   while ( j < largeur_matrice)
  11.     {
  12.       if ((matrice[i][j])=1)
  13.         {
  14.           nombre++;
  15.           glBegin(GL_QUADS);
  16.             glVertex2d(0-6.5,0+5);
  17.             glVertex2d(0-6.5+0.1,0+5);
  18.             glVertex2d(0-6.5+0.1,0+5-0.1);
  19.             glVertex2d(0-6.5,0+5-0.1);
  20.           glEnd();
  21.           j++;
  22.           glFlush();
  23.         }
  24.     }
  25.   i++;
  26.   j=0;
  27. };
  28. printf("nombre : %d", nombre);
  29. };


 
 
il m'indique alors 4800 1 c'est à dire toute la matrice remplie de 1.
ce qui n'est pas logique car précédemment il y a que 2346 1.



Cherchez le bug ;)

n°177150
smaragdus
whores, drugs & J.S. Bach
Posté le 16-07-2002 à 15:28:45  profilanswer
 

JeSuisPasUnNumero a écrit a écrit :

Cherchez le bug ;)  




 
grillé :D

n°177162
lordankou
Posté le 16-07-2002 à 15:37:54  profilanswer
 

grosse connerie épisode 2.  
je prépare bientôt l'épisode 3 mdrr. (j'ai corriger aussi une autre erreur. dans la deuxième boucle le j++ était dans le if  :sarcastic:)


---------------

n°177170
smaragdus
whores, drugs & J.S. Bach
Posté le 16-07-2002 à 15:43:04  profilanswer
 

lordankou a écrit a écrit :

grosse connerie épisode 2.  
je prépare bientôt l'épisode 3 mdrr. (j'ai corriger aussi une autre erreur. dans la deuxième boucle le j++ était dans le if  :sarcastic:)




 
pourquoi tu t'obstinnes avec les while alors que c'est des for() ?  :heink:

n°177194
lordankou
Posté le 16-07-2002 à 15:59:27  profilanswer
 

me revoila pour l'épisode 3  :D  
 

Code :
  1. matrice [0][0]=1;
  2. for(i=0; i < hauteur_matrice; i++)
  3. {
  4.   for(j=0; j < largeur_matrice; j++)
  5.     {
  6.       if ((matrice[i][j])==1)
  7.         {
  8.           glBegin(GL_QUADS);
  9.             //glVertex2d(-6.5+j*(6.5/80), 5-i*(5/60));
  10.             //glVertex2d(-6.5+(j+1)*(6.5/80), 5-i*(5/60));
  11.             //glVertex2d(-6.5+(j+1)*(6.5/80), 5-(i+1)*(5/60));
  12.             //glVertex2d(-6.5+j*(6.5/80), 5-(i+1)*(5/60));
  13.             glVertex2d(-6.5,5);
  14.             glVertex2d(-6.5+0.08125,5);
  15.             glVertex2d(-6.5+0.08125,5-0.08125);
  16.             glVertex2d(-6.5,5-0.08125);
  17.           glEnd();
  18.         }
  19.     }
  20. }
  21. glFlush();
  22. };


 
le problème c que quand j'utilise les formules en commentaire il me met aucun carré alors que les formules sans les commentaire ça marche. or si on prend i et j = 0 ce sont les même formules. (ou alors je suis vraiment nul en math et j'ai besoin de repos !)


---------------

n°177227
LeGreg
Posté le 16-07-2002 à 16:45:05  profilanswer
 

Code :
  1. glVertex2d(-6.5+j*(6.5/80), 5-i*(5/60));


 
5/60 c'est une division entiere
a mon avis le resultat est proche de zero.
 
5 c'est un entier et 5.0f c'est un float
 
LeGreg

n°177248
lordankou
Posté le 16-07-2002 à 17:01:52  profilanswer
 

exacte ! entiers et floattant c pas bon lol.


---------------

n°177290
red factio​n
Posté le 16-07-2002 à 18:03:27  profilanswer
 

bon ben c normal que le random donne la meme chose a chaque fois... il faut linitialiser au debut du programme avec
srand() <-- dans les parantheses tu met un nombre
 
en faisant  srand (time(NULL)) la tu est sur davoir un nombre au hasard (time renvoie le nb de sec ecoulees depuis minuit qui a chaque demmarage du prog est different(logique)) tu capte ?
 
bon faut pas oublier dinclure la librairie :
 
#include <time.h>
 
voila jsuis assez interresse ppar ton projet si tarrive a un resultat envoie le code je taiderai par la suite  :hello:  
 
 
 

n°177462
Musaran
Cerveaulté
Posté le 16-07-2002 à 23:33:44  profilanswer
 

Utilises les formes 5.0/6.0 ou 5lf/6lf pour forcer l'emploi de nombre flottants dès le départ du calcul.
 
Utilises double(j) et double(i) pour les mêmes raisons.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°177599
lordankou
Posté le 17-07-2002 à 10:08:13  profilanswer
 

ça avance doucement mais là encore un new prb.  
 

Code :
  1. for(i=1; i < hauteur_matrice-1; i++)
  2. {
  3.   for (j=1; j < largeur_matrice-1; j++)
  4.   {
  5.     if (matrice[i-1][j+1]==1)
  6.      cellule_a_cote++;
  7.     if (matrice[i][j+1]==1)
  8.       cellule_a_cote++;
  9.     if (matrice[i+1][j+1]==1)
  10.       cellule_a_cote++;
  11.     if (matrice[i+1][j]==1)
  12.       cellule_a_cote++;
  13.     if (matrice[i+1][j-1]==1)
  14.       cellule_a_cote++;
  15.     if (matrice[i][j+1]==1)
  16.       cellule_a_cote++;
  17.     if (matrice[i-1][j+1]==1)
  18.       cellule_a_cote++;
  19.     if (matrice[i-1][j]==1)
  20.       cellule_a_cote++;
  21.     if (matrice[i][j]==1)
  22.      {
  23.        switch (cellule_a_cote)
  24.          {
  25.            case 2 : matrice[i][j]=1 ; break;
  26.            case 3 : matrice[i][j]=1 ; break;
  27.            default : matrice[i][j]=0 ; break;
  28.          }
  29.      }
  30.     else
  31.      {
  32.        switch (cellule_a_cote)
  33.          {
  34.            case 3 : matrice[i][j]=1 ; break;
  35.            default : break;
  36.          }
  37.      }
  38.     cellule_a_cote = 0 ;
  39.   }
  40. }


 
en utilisant ce cas toutes les cellules du milieux crèvent. et celle des 3 premières lignes en haut et en bas restent vivantes.  
pour rappeler le principe du jeux de la vie :
Survie : toute cellule ayant au moins deux ou trois cellues voisines.
Naissance : toute case vide ayant exactement trois cellules voisines
mort : toute cellule ayant quatre cellules voisine ou ayant seulement une cellule voisine.
 
je sais que je parcours pas toute la matrice mais pour l'instant c fait exprès.


---------------

n°177911
red factio​n
Posté le 17-07-2002 à 15:38:46  profilanswer
 

lordankou a écrit a écrit :

ça avance doucement mais là encore un new prb.  
 

Code :
  1. for(i=1; i < hauteur_matrice-1; i++)
  2. {
  3.   for (j=1; j < largeur_matrice-1; j++)
  4.   {
  5.     if (matrice[i-1][j+1]==1)
  6.      cellule_a_cote++;
  7.     if (matrice[i][j+1]==1)
  8.       cellule_a_cote++;
  9.     if (matrice[i+1][j+1]==1)
  10.       cellule_a_cote++;
  11.     if (matrice[i+1][j]==1)
  12.       cellule_a_cote++;
  13.     if (matrice[i+1][j-1]==1)
  14.       cellule_a_cote++;
  15.     if (matrice[i][j+1]==1)
  16.       cellule_a_cote++;
  17.     if (matrice[i-1][j+1]==1)
  18.       cellule_a_cote++;
  19.     if (matrice[i-1][j]==1)
  20.       cellule_a_cote++;
  21.     if (matrice[i][j]==1)
  22.      {
  23.        switch (cellule_a_cote)
  24.          {
  25.            case 2 : matrice[i][j]=1 ; break;
  26.            case 3 : matrice[i][j]=1 ; break;
  27.            default : matrice[i][j]=0 ; break;
  28.          }
  29.      }
  30.     else
  31.      {
  32.        switch (cellule_a_cote)
  33.          {
  34.            case 3 : matrice[i][j]=1 ; break;
  35.            default : break;
  36.          }
  37.      }
  38.     cellule_a_cote = 0 ;
  39.   }
  40. }


 
en utilisant ce cas toutes les cellules du milieux crèvent. et celle des 3 premières lignes en haut et en bas restent vivantes.  
pour rappeler le principe du jeux de la vie :
Survie : toute cellule ayant au moins deux ou trois cellues voisines.
Naissance : toute case vide ayant exactement trois cellules voisines
mort : toute cellule ayant quatre cellules voisine ou ayant seulement une cellule voisine.
 
je sais que je parcours pas toute la matrice mais pour l'instant c fait exprès.  




 
pourquoi pas faire :  
 
 
 if (matrice[i-1][j+1]==1 || matrice[i][j+1]==1 || matrice[i+1][j+1]==1 || ... )
     cellule_a_cote++;
 

n°177980
lordankou
Posté le 17-07-2002 à 16:13:20  profilanswer
 

c pour une question de lisibilité que je mes comme ça. ensuite quand tout sera finit j'essaierai de réduire les parties de ce genre. pour l'instant je préfère garder comme ça c plus facile à la compréhension je trouve. et puis bah euh ça corrigera pas mon erreur en plus.  :(


---------------

n°178176
red factio​n
Posté le 17-07-2002 à 18:00:15  profilanswer
 

lordankou a écrit a écrit :

c pour une question de lisibilité que je mes comme ça. ensuite quand tout sera finit j'essaierai de réduire les parties de ce genre. pour l'instant je préfère garder comme ça c plus facile à la compréhension je trouve. et puis bah euh ça corrigera pas mon erreur en plus.  :(  




 
 
enfait je vois 2 solutions :
 
soit tu fait plusieurs boucles pour traiter les differentes partie de la matrice  
 
- une pour le centre (cest celle qui est la pour linstant, tu la deja faite)
- une pour les bords  
- et une pour les 4 coins  
 
 
en fait ca fait ca
 
+-----+
|*****|
|*****|
+-----+
 
 
ou alors tu fait une seule boucle qui traite tout mais faudrat mettre des if pour eviter de planter le prog qd tu accede aux elements i-1 j-1 i+1 ou j+1 du genre
 
if (i>=1){
   if (matrice[i-1][j]==1)  
     cellule_a_cote++;}
if (j>=-1){  
   if (matrice[i][j+1]==1)  
     cellule_a_cote++;}


Message édité par red faction le 17-07-2002 à 18:02:12
n°178181
smaragdus
whores, drugs & J.S. Bach
Posté le 17-07-2002 à 18:10:08  profilanswer
 

lordankou a écrit a écrit :

ça avance doucement mais là encore un new prb.  




 
Je ne me souviens plus très bien de l'algo de Conway (c'est loin) mais ne faut-il pas mettre le résultat du filtre dans une nouvelle matrice ?
 
Là, tu modifies la même matrice qui va servir au calcul des cellules adjacentes :??:  :??: Ton résultat change donc selon le parcours des cases de la matrice  :heink:

n°178185
lordankou
Posté le 17-07-2002 à 18:15:54  profilanswer
 

c'est ce que je comptais faire mais là le problème c que justement le traitement de la matrice principale foire totalement. sachant que c plus ou moins la même chose pour le reste si je règle pas ce problème ça n'avancera à rien. pour l'instant donc toutes les cellules meurent au centre alors que logiquement ça devrait pas arriver !!


---------------

n°178187
lordankou
Posté le 17-07-2002 à 18:17:19  profilanswer
 

Citation :


Je ne me souviens plus très bien de l'algo de Conway (c'est loin) mais ne faut-il pas mettre le résultat du filtre dans une nouvelle matrice ?  
 
Là, tu modifies la même matrice qui va servir au calcul des cellules adjacentes :??:  :??: Ton résultat change donc selon le parcours des cases de la matrice  :heink:  


 
oups oui là je modifie la même matrice quelle tarte !!!  
bon c'était la connerie épisode 3 !!


---------------

n°178192
red factio​n
Posté le 17-07-2002 à 18:29:39  profilanswer
 

lordankou a écrit a écrit :

Citation :


Je ne me souviens plus très bien de l'algo de Conway (c'est loin) mais ne faut-il pas mettre le résultat du filtre dans une nouvelle matrice ?  
 
Là, tu modifies la même matrice qui va servir au calcul des cellules adjacentes :??:  :??: Ton résultat change donc selon le parcours des cases de la matrice  :heink:  


 
oups oui là je modifie la même matrice quelle tarte !!!  
bon c'était la connerie épisode 3 !!




 
ben si tu me filais le code se serait plus facile a debuger... amoins que tu compte en faire un prog commercial   :D

n°178199
lordankou
Posté le 17-07-2002 à 18:43:38  profilanswer
 

euh bah bon voilà le nouveau code qui marche tjrs pas ! les cellules crèvent tjrs au milieu
 

Code :
  1. void test()
  2. {
  3. for(i=1; i < hauteur_matrice-1; i++)
  4. {
  5.   for (j=1; j < largeur_matrice-1; j++)
  6.   {
  7.     if (matrice[i-1][j+1]==1)
  8.      cellule_a_cote++;
  9.     if (matrice[i][j+1]==1)
  10.       cellule_a_cote++;
  11.     if (matrice[i+1][j+1]==1)
  12.       cellule_a_cote++;
  13.     if (matrice[i+1][j]==1)
  14.       cellule_a_cote++;
  15.     if (matrice[i+1][j-1]==1)
  16.       cellule_a_cote++;
  17.     if (matrice[i][j+1]==1)
  18.       cellule_a_cote++;
  19.     if (matrice[i-1][j+1]==1)
  20.       cellule_a_cote++;
  21.     if (matrice[i-1][j]==1)
  22.       cellule_a_cote++;
  23.     if (matrice[i][j]==1)
  24.      {
  25.        switch (cellule_a_cote)
  26.          {
  27.            case 2 : matrice_temporaire[i][j]=1 ; break;
  28.            case 3 : matrice_temporaire[i][j]=1 ; break;
  29.            default : matrice_temporaire[i][j]=0 ; break;
  30.          }
  31.      }
  32.     else
  33.      {
  34.        switch (cellule_a_cote)
  35.          {
  36.            case 3 : matrice_temporaire[i][j]=1 ; break;
  37.            default : matrice_temporaire[i][j]= 0 ;break;
  38.          }
  39.      }
  40.     cellule_a_cote = 0 ;
  41.   }
  42. }
  43. for(i=1; i < hauteur_matrice-1; i++)
  44. {
  45.   for (j=1; j < largeur_matrice-1; j++)
  46.   {
  47.     matrice_temporaire[i][j] = matrice [i][j];
  48.   }
  49. }
  50. }


 
avec l'init :  
 

Code :
  1. // initialisation de la matrice
  2. for(i=0; i < hauteur_matrice; i++)
  3. {
  4.   for (j=0; j < largeur_matrice; j++)
  5.     {
  6.         matrice[i][j] = rand() < (32767/10) ? 1 : 0 ;
  7.         matrice_temporaire[i][j] = matrice[i][j];
  8.     }
  9. };


---------------

n°178200
lordankou
Posté le 17-07-2002 à 18:45:40  profilanswer
 

bah euh voila tout le code bien sale lol. c pas du tout un prog commerciale.  
 

Code :
  1. #include <windows.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <gl\gl.h>
  5. #include <gl\glut.h>
  6. #define largeur 800
  7. #define hauteur 600
  8. int const largeur_matrice = largeur*2/10 ;
  9. int const hauteur_matrice = hauteur*2/10 ;
  10. int i =0;
  11. int j =0;
  12. int cellule_a_cote = 0 ;
  13. void Display();
  14. void Dessiner_carre();
  15. void Reshape(int, int);
  16. void test();
  17. void dessiner_matrice();
  18. int matrice [largeur_matrice][hauteur_matrice] ;
  19. int matrice_temporaire [largeur_matrice][hauteur_matrice] ;
  20. int main(int argc, char *argv[])
  21. {
  22. // initialisation de la matrice
  23. for(i=0; i < hauteur_matrice; i++)
  24. {
  25.   for (j=0; j < largeur_matrice; j++)
  26.     {
  27.         matrice[i][j] = rand() < (32767/10) ? 1 : 0 ;
  28.         matrice_temporaire[i][j] = matrice[i][j];
  29.     }
  30. };
  31. glutInit(&argc,argv);
  32. glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);   // double buffer, red green blue
  33. glutInitWindowSize(largeur,hauteur);    // 640*480
  34. glutInitWindowPosition(50,50);   // postion 50*50
  35. glutCreateWindow("MaFenetre" );   // Nom de la fenetre
  36. for(;;)
  37. {
  38.   glutDisplayFunc(Display); // affichage
  39.   glutReshapeFunc(Reshape); // camera
  40.   glutMainLoop();
  41. }
  42. return 0;
  43. }
  44. void Display()
  45. {
  46. glClearColor(0,0,0,0);
  47. glClear(GL_COLOR_BUFFER_BIT); // init frame buffer
  48. dessiner_matrice();
  49. test();
  50. };
  51. void Reshape(int w, int h)
  52. {
  53. float L;
  54. float H;
  55.     GLdouble aspect;
  56.     glLoadIdentity();
  57. gluOrtho2D(-1.0f * aspect, 1.0f * aspect, -1.0f, 1.0f);
  58. glMatrixMode(GL_MODELVIEW); // initialisation de la matrice de vue
  59. glLoadIdentity();
  60. if (w<=h)
  61. {
  62.  H=(GLfloat) (10*h/w);
  63.  L=10.0;
  64. }
  65. else
  66. {
  67.  H=10.0;
  68.  L=(GLfloat) (10*w/h);
  69. }
  70. gluOrtho2D(-L/2,L/2,-H/2,H/2);
  71. }
  72. void test()
  73. {
  74. for(i=1; i < hauteur_matrice-1; i++)
  75. {
  76.   for (j=1; j < largeur_matrice-1; j++)
  77.   {
  78.     if (matrice[i-1][j+1]==1)
  79.      cellule_a_cote++;
  80.     if (matrice[i][j+1]==1)
  81.       cellule_a_cote++;
  82.     if (matrice[i+1][j+1]==1)
  83.       cellule_a_cote++;
  84.     if (matrice[i+1][j]==1)
  85.       cellule_a_cote++;
  86.     if (matrice[i+1][j-1]==1)
  87.       cellule_a_cote++;
  88.     if (matrice[i][j+1]==1)
  89.       cellule_a_cote++;
  90.     if (matrice[i-1][j+1]==1)
  91.       cellule_a_cote++;
  92.     if (matrice[i-1][j]==1)
  93.       cellule_a_cote++;
  94.     if (matrice[i][j]==1)
  95.      {
  96.        switch (cellule_a_cote)
  97.          {
  98.            case 2 : matrice_temporaire[i][j]=1 ; break;
  99.            case 3 : matrice_temporaire[i][j]=1 ; break;
  100.            default : matrice_temporaire[i][j]=0 ; break;
  101.          }
  102.      }
  103.     else
  104.      {
  105.        switch (cellule_a_cote)
  106.          {
  107.            case 3 : matrice_temporaire[i][j]=1 ; break;
  108.            default : matrice_temporaire[i][j]= 0 ;break;
  109.          }
  110.      }
  111.     cellule_a_cote = 0 ;
  112.   }
  113. }
  114. for(i=1; i < hauteur_matrice-1; i++)
  115. {
  116.   for (j=1; j < largeur_matrice-1; j++)
  117.   {
  118.     matrice_temporaire[i][j] = matrice [i][j];
  119.   }
  120. }
  121. }
  122. void dessiner_matrice()
  123. {
  124. for(i=0; i < hauteur_matrice; i++)
  125. {
  126.   for(j=0; j < largeur_matrice; j++)
  127.     {
  128.       if ((matrice[i][j])==1)
  129.         {
  130.           glBegin(GL_QUADS);
  131.             glVertex2d(-6.5+j*(6.5/80.0), 5.0-i*(5.0/60.0));
  132.             glVertex2d(-6.5+(j+1.0)*(6.5/80.0), 5.0-i*(5.0/60.0));
  133.             glVertex2d(-6.5+(j+1.0)*(6.5/80), 5.0-(i+1.0)*(5.0/60.0));
  134.             glVertex2d(-6.5+j*(6.5/80.0), 5.0-(i+1.0)*(5.0/60.0));
  135.           glEnd();
  136.         }
  137.     }
  138. }
  139. glFlush();
  140. }


---------------

n°178208
smaragdus
whores, drugs & J.S. Bach
Posté le 17-07-2002 à 18:56:47  profilanswer
 

Alors :
 
1) Pourquoi initialiser la matrice temporaire ?  :heink:  
 
2) tu peux eviter de faire 2 for imbriqués pour switcher les 2 matrices : il suffit de swapper les 2 pointeurs : c'est infiniment plus rapide :
 

Code :
  1. // faire un truc du style :
  2. int** tmp = matrice;
  3. matrice = matrice_temporaire;
  4. matrice_temporaire = tmp;


 
Le problème c'est qu'il ne fallait pas utiliser de variables globales car ta fonction dessiner_matrice() pioche dans le tableau global "matrice" au lieu de lui passer en paramètre un pointeur.
 
"Les variables globales, c'est mal"   :non:


Message édité par smaragdus le 17-07-2002 à 18:58:27
n°178210
red factio​n
Posté le 17-07-2002 à 19:03:07  profilanswer
 


 
 for(i=1; i < hauteur_matrice-1; i++)
    {
        for (j=1; j < largeur_matrice-1; j++)
        {
            matrice_temporaire[i][j] = matrice [i][j];
        }
    }
 
 
smaragdus a raison et puis de toute facon  faut inverser la ligne --> matrice [i][j] = matrice_temporaire[i][j];

n°178269
lordankou
Posté le 17-07-2002 à 22:46:51  profilanswer
 

je vais revoir tout ça. c que bon les pointeurs je connais pas terriblement voir pas du tout c pour ça que j'utilise jamais. bon vais me trouver un bon cours sur les pointeurs et je reviens dans 8 jours (après mes vacances lol)
au fait c bon j'ai remodifier l'inversion dans les boucles mais bon mes cellules elles crèvent tjrs allors qu'elle devrait pas


---------------

n°178962
LeGreg
Posté le 19-07-2002 à 18:04:43  profilanswer
 

Code :
  1. if (matrice[i-1][j+1]==1)
  2.                cellule_a_cote++;
  3.             if (matrice[i][j+1]==1)
  4.                 cellule_a_cote++;
  5.             if (matrice[i+1][j+1]==1)
  6.                 cellule_a_cote++;
  7.             if (matrice[i+1][j]==1)
  8.                 cellule_a_cote++;
  9.             if (matrice[i+1][j-1]==1)
  10.                 cellule_a_cote++;
  11.             if (matrice[i][j+1]==1)
  12.                 cellule_a_cote++;
  13.             if (matrice[i-1][j+1]==1)
  14.                 cellule_a_cote++;
  15.             if (matrice[i-1][j]==1)
  16.                 cellule_a_cote++;


 
pourquoi ne pas reduire a ca:
 

Code :
  1. cellule_a_cote = cellule_a_cote
  2.                + matrice[i-1][j+1]
  3.                + matrice[i][j+1]
  4.                + matrice[i+1][j+1]
  5.                + matrice[i+1][j]
  6.                + matrice[i+1][j-1]
  7.                + matrice[i][j+1]
  8.                + matrice[i-1][j+1]
  9.                + matrice[i-1][j];


quelques conditions inutiles en moins ca ne fait pas de mal, non?
 
LeGreg

n°178965
LeGreg
Posté le 19-07-2002 à 18:07:11  profilanswer
 

de plus une matrice temporaire ca fait beaucoup
quand tu n'as besoin que de memoriser la ligne precedente
(ca depend de tes besoins en memoire en fait)
 
LeGreg

n°179022
ITM
Avatar peint à la main
Posté le 19-07-2002 à 23:28:59  profilanswer
 

lordankou a écrit a écrit :

je compte l'utilisais dans une autre version. là je commence progressivement car je teste deux chose à la fois : l'openGL et le jeu de la vie en incluant un système d'évolution.




 
Au vu de toutes ces conneries, t'es pas arrivé  :D  


---------------
iteme.free.fr | Mon feedback
n°184327
lordankou
Posté le 27-07-2002 à 17:33:02  profilanswer
 

Citation :


Au vu de toutes ces conneries, t'es pas arrivé  :D  


 
oui mais si on essaie rien on y arrive jamais. je sais bien que je fais des conneries mais bon tout le monde passe par là même toi qui a l'air vraiment intelligent...  :sarcastic:  
et de toute façon je suis là pour apprendre.


---------------

n°189164
Musaran
Cerveaulté
Posté le 03-08-2002 à 00:28:10  profilanswer
 

J'ai écrit a écrit :

Code :
  1. int matrice [largeur][hauteur] ;
  2. for(int i=0 ; i < hauteur ; i++){
  3.    for(int j=0 ; j < largeur ; j++){
  4.       matrice[i][j] = rand() < (32767/3) ? 1 : 0 ;





J'ai enduit tout le monde d'erreur en faisant une grosse bourde, et personne n'a rien vu...
...il faut inverser i et j. Je propose d'utliser h et l pour éviter toute confusion.
 
Pour gérer le problème de comptage sur les bords, une solution est d'utiliser un tableau plus grand d'1 case à chaque bord, ces cases devant rester vides.
Je propose aussi ceci:

Code :
  1. typedef int matrice_t[largeur_matrice][hauteur_matrice] ; //type matrice vraie
  2. typedef int (*pmatrice_t)[hauteur_matrice]  ; //type matrice par pointeur
  3. matrice_t  matrices[2]= {0} ; //tout initialisé à 0
  4. pmatrice_t matrice1   = &matrices[0][0] ;
  5. pmatrice_t matrice2   = &matrices[1][0] ;
  6. int comptervoisines(int lpos, int hpos){
  7. int nb= 0 ;
  8. for(int l= lpos-1 ; l<=lpos+1 ; ++lpos)
  9.  for(int h= hpos-1 ; h<=hpos+1 ; ++hpos)
  10.   if(l>0 && l<largeur_matrice && h>0 && h<hauteur_matrice) //si case dans le tableau
  11.    if(l!=lpos && h!=hpos) //si pas la cellule courante
  12.     nb+= matrice1[l][h] ; //compter
  13. return nb ;
  14. }
  15. void test(){
  16. for(int l= largeur_matrice-1 ; l>=0 ; --l){
  17.  for (int h= hauteur_matrice-1; h>=0 ; --h){
  18.   int cellule_a_cote= comptervoisines(l,h) ;
  19.   switch (cellule_a_cote){
  20.   case 2 : matrice2[l][h]=matrice1[l][h];break;//survie (inchangée)
  21.   case 3 : matrice2[l][h]=1             ;break;//naissance (ou survie)
  22.   default: matrice2[l][h]=0             ;break;//mort (ou inchangée)
  23.   }
  24.  }
  25. }
  26. //permutation des matrices
  27. pmatrice_t matricet ;
  28. matricet= matrice1 ;
  29. matrice1= matrice2 ;
  30. matrice2= matricet ;
  31. }

Le tableau de matrices peut très bien être agrandi pour constituer une mémoire de l'évolution.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°189251
ashDyson
Si ça saigne, ça peut mourrir.
Posté le 03-08-2002 à 12:14:18  profilanswer
 

He beh putain, C pas gagné!

mood
Publicité
Posté le   profilanswer
 


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

  erreur dans une boucle

 

Sujets relatifs
[php] erreur tres bizzare avec les jointures-need help ![php] ça veut dire quoi cette erreur ??
Boucle en HTMLVisual Basic - résoudre une erreur 430 !!
Les différents messages d'erreurcherche des nfos sur la gestion d'erreur en ASP avec SQL
[Erreur à l'execution] VC ne trouve pas le point d'entrée dans libcomnerreur en Vbscript je ne comprend pas du tout pourquoi!!
[PHP] Comment sortir d'une boucle avant sa finErreur de compilation
Plus de sujets relatifs à : erreur dans une boucle


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