Jeu de la vie C

Fermé
Sargarmatha Messages postés 51 Date d'inscription jeudi 8 mai 2008 Statut Membre Dernière intervention 7 décembre 2016 - 1 déc. 2010 à 18:28
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 - 1 déc. 2010 à 19:55
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);




}
A voir également:

14 réponses

strato-boy Messages postés 764 Date d'inscription mercredi 11 février 2009 Statut Membre Dernière intervention 19 janvier 2011 100
1 déc. 2010 à 18:43
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 ... )
0
strato-boy Messages postés 764 Date d'inscription mercredi 11 février 2009 Statut Membre Dernière intervention 19 janvier 2011 100
Modifié par strato-boy le 1/12/2010 à 18:49
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 ? )
0
Sargarmatha Messages postés 51 Date d'inscription jeudi 8 mai 2008 Statut Membre Dernière intervention 7 décembre 2016
1 déc. 2010 à 18:47
oui c'est exacte mais par contre j'ai jamais entendu parlé de l'allocation dynamique de memoire : /
0
Sargarmatha Messages postés 51 Date d'inscription jeudi 8 mai 2008 Statut Membre Dernière intervention 7 décembre 2016
1 déc. 2010 à 18:50
ok bah la je le compile avec Kate, mais la je suis chez moi donc je vais me contenter de c++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
strato-boy Messages postés 764 Date d'inscription mercredi 11 février 2009 Statut Membre Dernière intervention 19 janvier 2011 100
1 déc. 2010 à 18:52
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 ;-)
0
strato-boy Messages postés 764 Date d'inscription mercredi 11 février 2009 Statut Membre Dernière intervention 19 janvier 2011 100
1 déc. 2010 à 18:53
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 ? )
0
Sargarmatha Messages postés 51 Date d'inscription jeudi 8 mai 2008 Statut Membre Dernière intervention 7 décembre 2016
1 déc. 2010 à 19:00
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
0
strato-boy Messages postés 764 Date d'inscription mercredi 11 février 2009 Statut Membre Dernière intervention 19 janvier 2011 100
1 déc. 2010 à 19:07
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
0
Sargarmatha Messages postés 51 Date d'inscription jeudi 8 mai 2008 Statut Membre Dernière intervention 7 décembre 2016
1 déc. 2010 à 19:19
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.
0
Sargarmatha Messages postés 51 Date d'inscription jeudi 8 mai 2008 Statut Membre Dernière intervention 7 décembre 2016
1 déc. 2010 à 19:19
pas d'idee pour l'erreur de segmentation ?
0
strato-boy Messages postés 764 Date d'inscription mercredi 11 février 2009 Statut Membre Dernière intervention 19 janvier 2011 100
1 déc. 2010 à 19:24
je vais le passer en revu a grand coup de debuger, on va voir !
0
Sargarmatha Messages postés 51 Date d'inscription jeudi 8 mai 2008 Statut Membre Dernière intervention 7 décembre 2016
1 déc. 2010 à 19:26
OK merci je pense qu'il en a bien besoin ^^
0
strato-boy Messages postés 764 Date d'inscription mercredi 11 février 2009 Statut Membre Dernière intervention 19 janvier 2011 100
Modifié par strato-boy le 1/12/2010 à 19:33
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,
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
1 déc. 2010 à 19:55
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 ?
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
1 déc. 2010 à 19:55
PS : utilises le bouton "code" pour afficher des lignes de code dans le forum, ça garde les espaces avant les mots.
0