Problème programme "jeu de la vie"
Résolu
babache04
Messages postés
25
Date d'inscription
Statut
Membre
Dernière intervention
-
babache04 -
babache04 -
Bonsoir,
Je vous écrit car j'ai un exercice à faire en cours, je dois créer le programme du jeu de la vie mais j'ai soucis sur mon code, le principe est de créer une matrice dynamique dont le nombre de ligne et le nombre de colonne sont à la charge de l'utilisateur (c'est l'utilisateur qui les rentrent).. Comme une page de code est bien mieux que de longues explications voici ce que j'ai déjà fait : la fonction dimensionnement permet de demander a l'utilisateur le nombre de ligne et de colonne et la fonction initialisation permet la mise à 0 de tout le tableau puis de permettre d'entrer des données dans certaines cases de la matrice avec ses coordonnées.
Ceci est le code de mon "fonction.c" :
void dimensionnement(int *n, int *m)
{
printf("Combien de lignes pour le plateau ?\n");
scanf("%d",&n);
printf("Combien de colonnes pour le plateau ?\n");
scanf("%d",&m);
}
void initialisation(char**tab,int n,int m)
{
for(a=0;a<n;a++)
{
for(b=0;b<m;b++)
{
tab[a][b]=0;
}
}
printf("Combien de cellules vivantes pour la premiere generation ?\n");
scanf("%d",&i);
for(k=1;k<i;k++)
{
printf("Entrez les coordonnes de la cellule %d :\n",k);
scanf("%d%d",&c,&d);
if((c>n) || (d>m))
{
printf("Vous sortez du tableau ! Reessayez ..\n");
k--;
}
else if(tab[c][d]==1)
{
printf("Vous avez deja indiquer ces coordonnees ! Reessayez ..\n");
k--;
}
else
{
tab[c][d]=1;
}
}
}
Et ceci dans mon "main.c" :
int main()
{
dimensionnement(&n,&m);
tab=malloc(n*m*sizeof(char));
initialisation(tab,n,m);
}
Le soucis est que le programme "build normalement" jusqu'a la fin de dimensionnement mais quand le programme passe au "malloc" il plante..
Si j'enlève le "malloc" il compile mais il me dit que n (nombre de ligne) =0 et m (nombre de colonne) =0 aussi. Ce qui est problématique tout de même d'avoir un tableau avec 0 lignes et 0 colonnes .. :/
Merci d'avance pour vos réponses :)
Bonne soirée !
Je vous écrit car j'ai un exercice à faire en cours, je dois créer le programme du jeu de la vie mais j'ai soucis sur mon code, le principe est de créer une matrice dynamique dont le nombre de ligne et le nombre de colonne sont à la charge de l'utilisateur (c'est l'utilisateur qui les rentrent).. Comme une page de code est bien mieux que de longues explications voici ce que j'ai déjà fait : la fonction dimensionnement permet de demander a l'utilisateur le nombre de ligne et de colonne et la fonction initialisation permet la mise à 0 de tout le tableau puis de permettre d'entrer des données dans certaines cases de la matrice avec ses coordonnées.
Ceci est le code de mon "fonction.c" :
void dimensionnement(int *n, int *m)
{
printf("Combien de lignes pour le plateau ?\n");
scanf("%d",&n);
printf("Combien de colonnes pour le plateau ?\n");
scanf("%d",&m);
}
void initialisation(char**tab,int n,int m)
{
for(a=0;a<n;a++)
{
for(b=0;b<m;b++)
{
tab[a][b]=0;
}
}
printf("Combien de cellules vivantes pour la premiere generation ?\n");
scanf("%d",&i);
for(k=1;k<i;k++)
{
printf("Entrez les coordonnes de la cellule %d :\n",k);
scanf("%d%d",&c,&d);
if((c>n) || (d>m))
{
printf("Vous sortez du tableau ! Reessayez ..\n");
k--;
}
else if(tab[c][d]==1)
{
printf("Vous avez deja indiquer ces coordonnees ! Reessayez ..\n");
k--;
}
else
{
tab[c][d]=1;
}
}
}
Et ceci dans mon "main.c" :
int main()
{
dimensionnement(&n,&m);
tab=malloc(n*m*sizeof(char));
initialisation(tab,n,m);
}
Le soucis est que le programme "build normalement" jusqu'a la fin de dimensionnement mais quand le programme passe au "malloc" il plante..
Si j'enlève le "malloc" il compile mais il me dit que n (nombre de ligne) =0 et m (nombre de colonne) =0 aussi. Ce qui est problématique tout de même d'avoir un tableau avec 0 lignes et 0 colonnes .. :/
Merci d'avance pour vos réponses :)
Bonne soirée !
A voir également:
- Problème programme "jeu de la vie"
- 94 jeu - Télécharger - Puzzle & Réflexion
- Programme demarrage windows - Guide
- 94 degrés jeu - Télécharger - Divers Jeux
- Jeu zuma - Télécharger - Jeux vidéo
- Forcer la fermeture d'un programme - Guide
11 réponses
autant pour moi,
j'ai lu un peu vite. Ça ne changera rien d'inverser le malloc.
En revanche il ne faut pas faire
mais
car tu as déjà des pointeurs sur ton n et ton m
j'ai lu un peu vite. Ça ne changera rien d'inverser le malloc.
En revanche il ne faut pas faire
scanf("%d",&n);
mais
scanf("%d",n);
car tu as déjà des pointeurs sur ton n et ton m
J'ai un soucis au niveau de l'affichage, la consigne est que :
- pour les cellules mortes on doit afficher un '.'
- pour les cellules vivantes on doit afficher un 'o'
Mais ça me met l'erreur habituelle "miniprojet.exe" à cessé de fonctionner...
Voici le code de la fonction affichage :
- pour les cellules mortes on doit afficher un '.'
- pour les cellules vivantes on doit afficher un 'o'
Mais ça me met l'erreur habituelle "miniprojet.exe" à cessé de fonctionner...
Voici le code de la fonction affichage :
void affiche(char**tab,int n, int m) { int a, b; for(a=0;a<n;a++) { for(b=0;b<m;b++) { if(tab[a][b]==0) { tab[a][b]='.'; } else { tab[a][b]='o'; } printf("%d",tab[a][b]); } } }
Je vois que ça avance :-).
La façon n'est pas très propre. Lorsque tu affiches, il n'y a pas lieu de modifier le tableau.
Tout simplement :
putchar() c'est pour afficher un caractère à l'écran. Tu aurais pu mettre printf(".");
J'ai mis "\n" pour aller à la ligne. Sinon ça n'affichera pas un tableau mais tout en ligne.
Cdlt,
La façon n'est pas très propre. Lorsque tu affiches, il n'y a pas lieu de modifier le tableau.
Tout simplement :
for(a=0;a<n;a++) { for(b=0;b<m;b++) { if(tab[a][b]==0) putchar('.'); else putchar('o'); } putchar('\n'); }
putchar() c'est pour afficher un caractère à l'écran. Tu aurais pu mettre printf(".");
J'ai mis "\n" pour aller à la ligne. Sinon ça n'affichera pas un tableau mais tout en ligne.
Cdlt,
Salut,
Est-ce des erreurs de compilation ou d'exécution?
Il semblerait tout de même plus logique de faire le malloc avant l'appel de dimensionnement. On alloue et ensuite on remplie.
Il est fort probable qu'il faille faire un cast de ton retour de malloc en char**
Est-ce des erreurs de compilation ou d'exécution?
Il semblerait tout de même plus logique de faire le malloc avant l'appel de dimensionnement. On alloue et ensuite on remplie.
Il est fort probable qu'il faille faire un cast de ton retour de malloc en char**
Il semblerait tout de même plus logique de faire le malloc avant l'appel de dimensionnement.
Son dimensionnement sert à définir n et m. Il faut les définir avant d'allouer.
Il est fort probable qu'il faille faire un cast de ton retour de malloc en char**
Non ce n'est pas obligatoire, et même déconseillé. Depuis les normes ISO, le type générique void* est apparu et le retour de malloc sera promu implicitement en char**.
Cdlt,
Son dimensionnement sert à définir n et m. Il faut les définir avant d'allouer.
Il est fort probable qu'il faille faire un cast de ton retour de malloc en char**
Non ce n'est pas obligatoire, et même déconseillé. Depuis les normes ISO, le type générique void* est apparu et le retour de malloc sera promu implicitement en char**.
Cdlt,
C'est une erreur lors de l'exécution, la compilation se passe sans problèmes.
Je vais essayer de faire le malloc puis l'appel de dimensionnement ;)
Euh tu as parler de cast ?! Qu'est ce qu'un cast si c'est pas trop te demander :$
Je vais essayer de faire le malloc puis l'appel de dimensionnement ;)
Euh tu as parler de cast ?! Qu'est ce qu'un cast si c'est pas trop te demander :$
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour,
T'as oublié de définir tes variables tab, n et m dans ton main.
J'espère que tu ne les as pas mis en variable globale ?
Sinon attention à l'allocation. Tu souhaites faire un tableau deux dimensions mais tu l'alloues comme un tableau une dimension.
Une façon de faire :
Idéalement, il faudrait tester les retours de malloc pour savoir s'il n'y a pas eu d'erreurs.
Et, il ne faut pas oublier non plus de désallouer les cases avant de quitter le programme.
Corrige les erreurs, et repose ton code en l'englobant dans des balises codes (à droite du bouton souligné) sinon c'est illisible. Précise par la même occasion les messages de warnings et d'erreurs de ton compilateur après compilation.
Cdlt,
T'as oublié de définir tes variables tab, n et m dans ton main.
J'espère que tu ne les as pas mis en variable globale ?
Sinon attention à l'allocation. Tu souhaites faire un tableau deux dimensions mais tu l'alloues comme un tableau une dimension.
Une façon de faire :
char **tab; int i; tab=malloc(n * sizeof(char*)); for(i=0; i<n; i++) { tab[i]=malloc(m * sizeof(char)); }
Idéalement, il faudrait tester les retours de malloc pour savoir s'il n'y a pas eu d'erreurs.
Et, il ne faut pas oublier non plus de désallouer les cases avant de quitter le programme.
Corrige les erreurs, et repose ton code en l'englobant dans des balises codes (à droite du bouton souligné) sinon c'est illisible. Précise par la même occasion les messages de warnings et d'erreurs de ton compilateur après compilation.
Cdlt,
et le malloc tu ferais bien comme ceci :
tab=malloc(n*m*sizeof(char));
(bien sur dans le main.c et non dans le fonction.c)
tab=malloc(n*m*sizeof(char));
(bien sur dans le main.c et non dans le fonction.c)
C'est une erreur lors de l'exécution, la compilation se passe sans problèmes.
Oui, mais c'est pas ce que je demande ^^. Je demande que tu corriges ton code en tenant compte de nos remarques ET que tu repostes le code corrigé avec les nouveaux messages du compilateur.
Je vais essayer de faire le malloc puis l'appel de dimensionnement ;)
Non. Relis mon post. C'est ton allocation qui n'est pas bonne. Tu dois faire un malloc général et des malloc dans une boucle for. Je t'ai mis un exemple dans mon précédent post.
Euh tu as parler de cast ?! Qu'est ce qu'un cast si c'est pas trop te demander :$
Oublie le cast, t'en as pas besoin ;-))). Sinon pour info, le cast consiste à dire à ton compilateur que le type de variable est à traiter comme un autre.
Et n'oublie pas de prendre en compte dans ta fonction dimensionnement la remarque de flo13142 : scanf("%d",n); et scanf("%d",m); Il ne faut pas mettre d'esperluettes (&) devant les variables car il s'agit de pointeurs.
Cdlt,
Oui, mais c'est pas ce que je demande ^^. Je demande que tu corriges ton code en tenant compte de nos remarques ET que tu repostes le code corrigé avec les nouveaux messages du compilateur.
Je vais essayer de faire le malloc puis l'appel de dimensionnement ;)
Non. Relis mon post. C'est ton allocation qui n'est pas bonne. Tu dois faire un malloc général et des malloc dans une boucle for. Je t'ai mis un exemple dans mon précédent post.
Euh tu as parler de cast ?! Qu'est ce qu'un cast si c'est pas trop te demander :$
Oublie le cast, t'en as pas besoin ;-))). Sinon pour info, le cast consiste à dire à ton compilateur que le type de variable est à traiter comme un autre.
Et n'oublie pas de prendre en compte dans ta fonction dimensionnement la remarque de flo13142 : scanf("%d",n); et scanf("%d",m); Il ne faut pas mettre d'esperluettes (&) devant les variables car il s'agit de pointeurs.
Cdlt,
Ahhhhhhhhh merveilleux c'est ça le problème que j'avais, je faisais pas le bon malloc !!!!!! Un ENORME MERCI !!!!!! Je vous retiens au courant après les modifs ;)
Alors mon tableau marche très bien, mais voila comme une erreur n'est jamais seule, en voila une autre..
dans ma fonction initialisation, après avoir créer le tableau, l'avoir initialiser à zéro, je demande les coordonnées des valeurs a passer à 1,
sauf que cela m'affiche "l'inverse" du tableau..
Voici la fonction :
void initialisation(char**tab,int n,int m)
{
int a,b, i, k, c, d;
for(a=0;a<n;a++)
{
for(b=0;b<m;b++)
{
tab[a][b]=0;
}
}
printf("Combien de cellules vivantes pour la premiere generation ?\n");
scanf("%d",&i);
for(k=1;k<i;k++)
{
printf("Entrez les coordonnes de la cellule %d :\n",k);
scanf("%d%d",&c,&d);
if((c>n) || (d>m))
{
printf("Vous sortez du tableau ! Reessayez ..\n");
k--;
}
else if(tab[c][d]==1)
{
printf("Vous avez deja indiquer ces coordonnees ! Reessayez ..\n");
k--;
}
else
{
tab[c+1][d+1]=1;
}
}
for(a=0;a<n;a++)
{
printf("\n");
for(b=0;b<m;b++)
{
printf("%d",tab[a][b]);
}
}
printf("\n");
}
Et quand je rentre :
4 lignes et 4 colonnes
3 pour cellules vivantes
coordonnée de la cellule 1 : 2 1
coordonnée de la cellule 2 : 1 2
le programme m'affiche le tableau : j'aurais voulu :
0000 0100
0000 1000
0001 0000
0010 0000
On dirais l'inverse de ce que je voulais ..
dans ma fonction initialisation, après avoir créer le tableau, l'avoir initialiser à zéro, je demande les coordonnées des valeurs a passer à 1,
sauf que cela m'affiche "l'inverse" du tableau..
Voici la fonction :
void initialisation(char**tab,int n,int m)
{
int a,b, i, k, c, d;
for(a=0;a<n;a++)
{
for(b=0;b<m;b++)
{
tab[a][b]=0;
}
}
printf("Combien de cellules vivantes pour la premiere generation ?\n");
scanf("%d",&i);
for(k=1;k<i;k++)
{
printf("Entrez les coordonnes de la cellule %d :\n",k);
scanf("%d%d",&c,&d);
if((c>n) || (d>m))
{
printf("Vous sortez du tableau ! Reessayez ..\n");
k--;
}
else if(tab[c][d]==1)
{
printf("Vous avez deja indiquer ces coordonnees ! Reessayez ..\n");
k--;
}
else
{
tab[c+1][d+1]=1;
}
}
for(a=0;a<n;a++)
{
printf("\n");
for(b=0;b<m;b++)
{
printf("%d",tab[a][b]);
}
}
printf("\n");
}
Et quand je rentre :
4 lignes et 4 colonnes
3 pour cellules vivantes
coordonnée de la cellule 1 : 2 1
coordonnée de la cellule 2 : 1 2
le programme m'affiche le tableau : j'aurais voulu :
0000 0100
0000 1000
0001 0000
0010 0000
On dirais l'inverse de ce que je voulais ..
Je répète, la prochaine fois : poste ton code en le mettant dans tes balises codes (à droite du bouton souligné) car c'est illisible...
Sinon l'erreur est toute simple : tab[c+1][d+1]=1;
Donc si tu rentres 2 1 en cordonnées ça va l'afficher en tab[3][2], c'est-à-dire 4ème ligne et 3ème colonne (les cases commencent à 0).
Soit l'utilisateur entre les coordonnées entre 0 et n non inclus, soit il l'entre entre 1 et n inclus. Dans le deuxième cas, il faudra mettre : tab[c-1][d-1]=1; et modifier les if pour voir s'il y a débordement.
Sinon l'erreur est toute simple : tab[c+1][d+1]=1;
Donc si tu rentres 2 1 en cordonnées ça va l'afficher en tab[3][2], c'est-à-dire 4ème ligne et 3ème colonne (les cases commencent à 0).
Soit l'utilisateur entre les coordonnées entre 0 et n non inclus, soit il l'entre entre 1 et n inclus. Dans le deuxième cas, il faudra mettre : tab[c-1][d-1]=1; et modifier les if pour voir s'il y a débordement.
Maintenant j'ai un petit soucis, je dois demander a l'utilisateur combien de cellules vivantes il veut au départ, j'ai donc ce code :
Mais pour ce code la si je rentre 3 valeurs il ne me demande que de rentrer les coordonnées de 2 cellules, et quand je met "k=i" dans le for, ça plante... :/ Une solution ?!
for(k=1;k<i;k++) { printf("Entrez les coordonnes de la cellule %d :\n",k); scanf("%d%d",&c,&d); if((c>n) || (d>m)) { printf("Vous sortez du tableau ! Reessayez ..\n"); k--; } else if(tab[c][d]==1) { printf("Vous avez deja indiquer ces coordonnees ! Reessayez ..\n"); k--; } else { tab[c-1][d-1]=1; } }
Mais pour ce code la si je rentre 3 valeurs il ne me demande que de rentrer les coordonnées de 2 cellules, et quand je met "k=i" dans le for, ça plante... :/ Une solution ?!
C'est bon j'ai eu l'évaluation sur le jeu, j'ai réussi à coder les 3/4 du jeu, et je m'en suis sorti avec un petit 14/20, ce qui bien évidement ne serait pas arrivé sans ce post et ceux qui l'ont fait vivre, UN GRAND MERCI a vous, bonne continuation !!!!
Signé : Babache04
Voyager en Saône et Loire : www.macontaxi.fr
Signé : Babache04
Voyager en Saône et Loire : www.macontaxi.fr