Jeu de la vie C [Fermé]

Signaler
Messages postés
51
Date d'inscription
jeudi 8 mai 2008
Statut
Membre
Dernière intervention
7 décembre 2016
-
Pacorabanix
Messages postés
3251
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
18 mai 2013
-
Bonjour a tous,

Voila je doit rendre un programme en langage C intitulé le jeu de la vie
mais voila après compilation et exécution de mon programme j'obtiens un message d'erreur : "erreur de segmentation"

De plus dans ma fonction comptage j'ai fait afficher le compteur mais celui m'affiche des nombres totalement aberrants .... Je pense que l'erreur se trouve au niveau des indices
de mon tableau


Si quelqu'un pouvais m'aider, ça fait des jours que je cherche la solution ....

#include <stdio.h>
#include <stdlib.h>
#include <math.h>



// fonction d'initialisation qui remplit un automate

void tableau ( int tab[50][50],int tab2[50][50])
{
int i,j;


for (i=0; i<50; i=i+1)
{
for (j=0; j<50; j=j+1)
tab[i][j]=0;
tab2[i][j]=0;
}


}




void saisie (int tab[50][50])//Fonction qui permet la saisie de cellules vivantes
{
int i,j,d; int a = 1;

printf ("\n combien de valeurs voulez vous entrer ? : ");
scanf ("%d", &d);

for(a=1;a<=d;a++)
{printf ("\n Entrer une coordonnee verticale: ");
scanf ("%d", &i);
printf ("\n Entrer une coordonnee horizontale : ");
scanf ("%d", &j);

tab[i+1][j+1]=1;

}
}




//fonction qui permet d'afficher le tableau avec les nouvelles coordonnées
void affichage ( int tab[50][50])
{
int i,j;


for (i=0; i<50; i=i+1)
{ printf("\n");

for (j=0; j<50; j=j+1)

printf("%d ", tab[i+1][j+1]);
}
}





// fonction de compatge
int comptage(int tab[50][50],int tab2[50][50])
{
int i,j,a;

for(i=0;i<50;i++)
{
for(j=0;j<50;j++)
{

a=0;

if((i==0)&&(j==0))
{a=tab[i][j+1]+tab[i+1][j]+tab[i+1][j+1];}

if((i==49)&&(j==49))
{ a=tab[i-1][j-1]+tab[i-1][j]+tab[i][j-1];}

if((i==0)&&(j==49))
{a=tab[i][j-1]+tab[i+1][j]+tab[i+1][j-1];}

if((i==49)&(j==0))
{ a=tab[i-1][j]+tab[i-1][j+1]+tab[i][j+1];}

if((i==0)&&(j!=49)&&(j!=0))
{a=tab[i][j-1]+tab[i+1][j-1]+tab[i+1][j]+tab[i+1][j+1]+tab[i][j+1];}

if((j==0)&&(i!=49)&&(i!=0))
{a=tab[i][j-1]+tab[i+1][j-1]+tab[i+1][j]+tab[i+1][j+1]+tab[i][j+1];}

if((j==49)&&(i!=49)&&(i!=0))
{a=tab[i-1][j]+tab[i-1][j-1]+tab[i][j-1]+tab[i+1][j-1]+tab[i+1][j+1];}

if((i==49)&&(j!=49)&&(j!=0))
{a=tab[i+1][j-1]+tab[i][j-1]+tab[i][j]+tab[i][j+1]+tab[i+1][j+1];}

if((j!=0)&&(j!=49)&&(i!=49)&&(i!=0))
{a=tab[i-1][j]+tab[i-1][j-1]+tab[i][j-1]+tab[i+1][j-1]+tab[i+1][j]+tab[i+1][j+1]+tab[i][j+1]+tab[i-1][j+1];

printf("%d", a );



if ((tab[i][j]==1) && (a==1 || 0)) //1er cas
{tab2[i][j]=0;}

if ((tab[i][j]==1) && (a == 2 || 3)) //2eme Cas
{tab2[i][j]=1;}

if ((tab[i][j]==1) && (a>= 4)) //3eme Cas
{tab2[i][j]=0;}

if ((tab[i][j]==0) && (a == 3)) // 4eem Cas
{tab2[i][j]=1;}


}
}

}
return a ;
}
//fonction arret
void arret(int tab[50][50],int tab2[50][50])
{
int i,j;
int c=0;

for(i=0;i<50;i++)
{
for(j=0;j<50;j++)
{
c=c+tab2[50][50];
}
}
return c;
}



//programme principale
main ()

{
printf("\n\n\n\n\n\n" );
printf(" -=> Bienvenu dans le jeu de la vie <=-" );
printf("\n\n\n\n\n\n" );

int a,i,j;
int tab[50][50];
int tab2[50][50];

tableau(tab,tab2);
saisie(tab);
affichage(tab);
printf("\n\n" );
comptage(tab,tab2);




}

14 réponses

Messages postés
770
Date d'inscription
mercredi 11 février 2009
Statut
Membre
Dernière intervention
19 janvier 2011
90
tu serais pas en DUT info toi ? j'ai eu le même sujet la semaine derniere :-p
deja question, on vous a déja parler de l'allocation dynamique de memoire ?
(je regarde vite fais ton code et je te dis quoi ... )
Messages postés
770
Date d'inscription
mercredi 11 février 2009
Statut
Membre
Dernière intervention
19 janvier 2011
90
if ((tab[i][j]==1) && (a==1 || 0)) //1er cas 

if ((tab[i][j]==1) && (a == 2 || 3)) //2eme Cas  


...
les condition m'embete, ecrit plutot (a==1 || a = 0) ou (a==2 || a==3)

la fonction arret, on dirai que tu ne l'utilise pas. c'est normal ?

(au passage, le code, tu le compile avec quoi ? )
Messages postés
51
Date d'inscription
jeudi 8 mai 2008
Statut
Membre
Dernière intervention
7 décembre 2016

oui c'est exacte mais par contre j'ai jamais entendu parlé de l'allocation dynamique de memoire : /
Messages postés
51
Date d'inscription
jeudi 8 mai 2008
Statut
Membre
Dernière intervention
7 décembre 2016

ok bah la je le compile avec Kate, mais la je suis chez moi donc je vais me contenter de c++
Messages postés
770
Date d'inscription
mercredi 11 février 2009
Statut
Membre
Dernière intervention
19 janvier 2011
90
a ok ok, en gros au lieu de ce limité a un tableau de 50 par 50, tu aurais pu en faire un de taille "variable".

pour la fonction de comptage, je vais la tester, la flemme de tout lire si c'est pas necessaire, je te tiens au courant ;-)
Messages postés
770
Date d'inscription
mercredi 11 février 2009
Statut
Membre
Dernière intervention
19 janvier 2011
90
bon y a l'air d'avoir un bug sur le commentaire d'avant, je test ta fonction de comptage et je te tiens au courant !

( tu travaill sous windows ? linux ? mac ? autre ? )
Messages postés
51
Date d'inscription
jeudi 8 mai 2008
Statut
Membre
Dernière intervention
7 décembre 2016

Oui mais on nous a dit de nous limiter à 50 par 50, normalement la fonction de comptage est bonne je l'ai vérifié et revérifie mais on sais jamais .... : -) et là je travaille sur Windows
Messages postés
770
Date d'inscription
mercredi 11 février 2009
Statut
Membre
Dernière intervention
19 janvier 2011
90
ok ok mais la fonction arret, je comprend pas son utilité ...

et au passage, t'aurais vu l'alloc' dynamique, je t'aurais bien refilé mon code, mais la tu vas rien comprendre :-s
Messages postés
51
Date d'inscription
jeudi 8 mai 2008
Statut
Membre
Dernière intervention
7 décembre 2016

lol ... la fonction arrêt sert a rien pour le moment, ce sera pour dire au programme de s'arrête si le tableau et rempli de 0 ou de 1 mais elle est pas encore fini.
Messages postés
51
Date d'inscription
jeudi 8 mai 2008
Statut
Membre
Dernière intervention
7 décembre 2016

pas d'idee pour l'erreur de segmentation ?
Messages postés
770
Date d'inscription
mercredi 11 février 2009
Statut
Membre
Dernière intervention
19 janvier 2011
90
je vais le passer en revu a grand coup de debuger, on va voir !
Messages postés
51
Date d'inscription
jeudi 8 mai 2008
Statut
Membre
Dernière intervention
7 décembre 2016

OK merci je pense qu'il en a bien besoin ^^
Messages postés
770
Date d'inscription
mercredi 11 février 2009
Statut
Membre
Dernière intervention
19 janvier 2011
90
en remaniant un peu ton code ( Kate accepte de compilé ça ?! 0_o, de mon coté, gcc m'a inondé d'erreurs, y a fallu biduoiller un chouilla )

et moi, de mon coté, j'ai pas de segfault, mais l'affichage se passe mal pour la toute derniere case,
Messages postés
3251
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
18 mai 2013
560
salut

une erreur de segmentation, c'est une erreur d'accès mémoire.

comme tu utilises des tableaux, c'est souvent lié au fait d'accéder à un indice de tableau interdit (du genre tab[123] si le tableau est de taille 50 )

j'ai donc cherché dans ton code ce qui pouvait poser problème à ce niveau et j'ai trouvé ça :


for (i=0; i<50; i=i+1)
{
  printf("\n");
  for (j=0; j<50; j=j+1)
    printf("%d ", tab[i+1][j+1]);
}
 


en gros

si i vaut 49, tu vas essayer d'afficher tab[50][xx] qui n'existe pas...

(idem pour j)

et enplus il manque une accolade, non ?
Pacorabanix
Messages postés
3251
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
18 mai 2013
560
PS : utilises le bouton "code" pour afficher des lignes de code dans le forum, ça garde les espaces avant les mots.