erreur dans une boucle

erreur dans une boucle - C++ - Programmation

Marsh Posté le 15-07-2002 à 21:36:41    

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)


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

Reply

Marsh Posté le 15-07-2002 à 21:36:41   

Reply

Marsh Posté le 15-07-2002 à 21:38:39    

Ben oui normal.

Reply

Marsh Posté le 15-07-2002 à 21:44:22    

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
Reply

Marsh Posté le 15-07-2002 à 21:46:13    

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


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

Reply

Marsh Posté le 15-07-2002 à 21:49:21    

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?

Reply

Marsh Posté le 15-07-2002 à 22:00:52    

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.


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

Reply

Marsh Posté le 15-07-2002 à 22:11:18    

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 ;

Reply

Marsh Posté le 16-07-2002 à 02:34:31    

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
Reply

Marsh Posté le 16-07-2002 à 09:09:14    

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

Reply

Marsh Posté le 16-07-2002 à 15:19:49    

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

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

Reply

Marsh Posté le 16-07-2002 à 15:19:49   

Reply

Marsh Posté le 16-07-2002 à 15:25:31    

C'est une blague ou quoi ?
 

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


 

Reply

Marsh Posté le 16-07-2002 à 15:26:08    

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

Reply

Marsh Posté le 16-07-2002 à 15:28:45    

JeSuisPasUnNumero a écrit a écrit :

Cherchez le bug ;)  




 
grillé :D

Reply

Marsh Posté le 16-07-2002 à 15:37:54    

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:)


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

Reply

Marsh Posté le 16-07-2002 à 15:43:04    

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:

Reply

Marsh Posté le 16-07-2002 à 15:59:27    

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 !)


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

Reply

Marsh Posté le 16-07-2002 à 16:45:05    

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

Reply

Marsh Posté le 16-07-2002 à 17:01:52    

exacte ! entiers et floattant c pas bon lol.


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

Reply

Marsh Posté le 16-07-2002 à 18:03:27    

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:  
 
 
 

Reply

Marsh Posté le 16-07-2002 à 23:33:44    

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
Reply

Marsh Posté le 17-07-2002 à 10:08:13    

ç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.


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

Reply

Marsh Posté le 17-07-2002 à 15:38:46    

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++;
 

Reply

Marsh Posté le 17-07-2002 à 16:13:20    

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.  :(


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

Reply

Marsh Posté le 17-07-2002 à 18:00:15    

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
Reply

Marsh Posté le 17-07-2002 à 18:10:08    

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:

Reply

Marsh Posté le 17-07-2002 à 18:15:54    

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 !!


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

Reply

Marsh Posté le 17-07-2002 à 18:17:19    

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 !!


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

Reply

Marsh Posté le 17-07-2002 à 18:29:39    

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

Reply

Marsh Posté le 17-07-2002 à 18:43:38    

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


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

Reply

Marsh Posté le 17-07-2002 à 18:45:40    

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. }


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

Reply

Marsh Posté le 17-07-2002 à 18:56:47    

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
Reply

Marsh Posté le 17-07-2002 à 19:03:07    


 
 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];

Reply

Marsh Posté le 17-07-2002 à 22:46:51    

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


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

Reply

Marsh Posté le 19-07-2002 à 18:04:43    

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

Reply

Marsh Posté le 19-07-2002 à 18:07:11    

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

Reply

Marsh Posté le 19-07-2002 à 23:28:59    

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
Reply

Marsh Posté le 27-07-2002 à 17:33:02    

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.


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

Reply

Marsh Posté le 03-08-2002 à 00:28:10    

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
Reply

Marsh Posté le 03-08-2002 à 12:14:18    

He beh putain, C pas gagné!

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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