erreur dans une boucle - C++ - Programmation
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 )?
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
Marsh Posté le 15-07-2002 à 21:49:21
Code :
|
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?
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.
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 :
|
Marsh Posté le 16-07-2002 à 02:34:31
Mettons un peu d'ordre la-dedans
Code :
|
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...
Marsh Posté le 16-07-2002 à 15:19:49
quand je remplis la matrice comme suit :
Code :
|
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 :
|
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.
Marsh Posté le 16-07-2002 à 15:26:08
lordankou a écrit a écrit : quand je remplis la matrice comme suit :
|
Cherchez le bug
Marsh Posté le 16-07-2002 à 15:28:45
JeSuisPasUnNumero a écrit a écrit : Cherchez le bug |
grillé
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 )
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 ) |
pourquoi tu t'obstinnes avec les while alors que c'est des for() ?
Marsh Posté le 16-07-2002 à 15:59:27
me revoila pour l'épisode 3
Code :
|
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 !)
Marsh Posté le 16-07-2002 à 16:45:05
Code :
|
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
Marsh Posté le 16-07-2002 à 17:01:52
exacte ! entiers et floattant c pas bon lol.
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
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.
Marsh Posté le 17-07-2002 à 10:08:13
ça avance doucement mais là encore un new prb.
Code :
|
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.
Marsh Posté le 17-07-2002 à 15:38:46
lordankou a écrit a écrit : ça avance doucement mais là encore un new prb.
|
pourquoi pas faire :
if (matrice[i-1][j+1]==1 || matrice[i][j+1]==1 || matrice[i+1][j+1]==1 || ... )
cellule_a_cote++;
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.
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++;}
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
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 !!
Marsh Posté le 17-07-2002 à 18:17:19
Citation : |
oups oui là je modifie la même matrice quelle tarte !!!
bon c'était la connerie épisode 3 !!
Marsh Posté le 17-07-2002 à 18:29:39
lordankou a écrit a écrit :
|
ben si tu me filais le code se serait plus facile a debuger... amoins que tu compte en faire un prog commercial
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 :
|
avec l'init :
Code :
|
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 :
|
Marsh Posté le 17-07-2002 à 18:56:47
Alors :
1) Pourquoi initialiser la matrice temporaire ?
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 :
|
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"
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];
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
Marsh Posté le 19-07-2002 à 18:04:43
Code :
|
pourquoi ne pas reduire a ca:
Code :
|
quelques conditions inutiles en moins ca ne fait pas de mal, non?
LeGreg
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
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é
Marsh Posté le 27-07-2002 à 17:33:02
Citation : |
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...
et de toute façon je suis là pour apprendre.
Marsh Posté le 03-08-2002 à 00:28:10
J'ai écrit a écrit :
|
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 :
|
Le tableau de matrices peut très bien être agrandi pour constituer une mémoire de l'évolution.
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)
---------------