Problème de fonction qui plante
Résolu
Airox
Messages postés
146
Date d'inscription
Statut
Membre
Dernière intervention
-
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour à tous,
Je suis en train de créer un démineur en langage C, j'essaye de réaliser une fonction qui dévoile automatiquement toutes les cases sans bombes à proximité lorsqu'on la sélectionne.
Je regarde donc la case en haut, à droite, en bas et à gauche et je le propage en répétant la fonction. Lorsque j'utilise seulement deux conditions, par exemple haut gauche ou bas gauche. Mais quand je fais des conditions opposées comme haut bas et droite gauche ça plante. Donc la fonction est inutilisable.
Je vous donne le code:
Cordialement Airox
Je suis en train de créer un démineur en langage C, j'essaye de réaliser une fonction qui dévoile automatiquement toutes les cases sans bombes à proximité lorsqu'on la sélectionne.
Je regarde donc la case en haut, à droite, en bas et à gauche et je le propage en répétant la fonction. Lorsque j'utilise seulement deux conditions, par exemple haut gauche ou bas gauche. Mais quand je fais des conditions opposées comme haut bas et droite gauche ça plante. Donc la fonction est inutilisable.
Je vous donne le code:
void caseVide(int x, int y, int grilleValeur[XMAX+2][YMAX+2], int grilleUser[XMAX][YMAX], int *compteurVictoire, int *j) { //Condition //Case du dessus if(x>0 && grilleUser[x-1][y]==0) //On regarde si ça ne dépasse pas du tableau et si la case a déjà était dévoilé { if(grilleValeur[x][y+1]==0) //Je regarde si la case est un 0 { caseVide(x-1,y,grilleValeur,grilleUser,&*compteurVictoire,&*j);//Je répète la fonction *j=*j+1;//J'incrément ma boucle de 1; } grilleUser[x-1][y]=1; //Je dévoile la case *compteurVictoire = *compteurVictoire+1; //J'incrémente le compteur de victoire de 1 } //Case de droite if(y<YMAX-1 && grilleUser[x][y+1]==0) { if(grilleValeur[x+1][y+2]==0) { caseVide(x,y+1,grilleValeur,grilleUser,&*compteurVictoire,&*j); *j=*j+1; } grilleUser[x][y+1]=1; *compteurVictoire = *compteurVictoire+1; } //Case du bas if(x<XMAX-1 && grilleUser[x+1][y]==0) { if(grilleValeur[x+2][y+1]==0) { caseVide(x+1,y,grilleValeur,grilleUser,&*compteurVictoire,&*j); *j=*j+1; } grilleUser[x+1][y]=1; *compteurVictoire = *compteurVictoire+1; } //Case de gauche if(y>0 && grilleUser[x][y-1]==0) { if(grilleValeur[x+1][y]==0) { caseVide(x,y-1,grilleValeur,grilleUser,&*compteurVictoire,&*j); *j=*j+1; } grilleUser[x][y-1]=1; *compteurVictoire = *compteurVictoire+1; } }
Cordialement Airox
A voir également:
- Problème de fonction qui plante
- Fonction si et - Guide
- Plante - Guide
- Fonction miroir - Guide
- Mon telephone plante que faire - Guide
- Cette plante encore peu connue fleurit toute l'année - Et elle est magnifique ! - Guide
1 réponse
Bonjour
Je n'ai pas regardé ton code en détail, mais je crois que tu devrais dévoiler une case AVANT d'appeler récursivement caseVide.
Sans cela, tu n'as pas de condition de fin de récursion.
L'examen de la case (0,0) appelle l'examen de la case (0,1) qui rappelle l'examen de la case (0,0) qui rappelle l'examen de la case (0,1)…
Au passage, j'aimerais bien avoir une idée de la logique qui t'a amené à utiliser des indices décalés entre tes deux tableaux grilleUser et grilleValeur, ça rend ton code incompréhensible.
D'autre part, je ne suis pas expert en C, mais il me semble que tes &* devant compteurVictoire et j lors des appels de caseVide sont parfaitement inutiles. L'adresse de ce qui est pointé par un pointeur est donnée par le pointeur lui même.
Je n'ai pas regardé ton code en détail, mais je crois que tu devrais dévoiler une case AVANT d'appeler récursivement caseVide.
Sans cela, tu n'as pas de condition de fin de récursion.
L'examen de la case (0,0) appelle l'examen de la case (0,1) qui rappelle l'examen de la case (0,0) qui rappelle l'examen de la case (0,1)…
Au passage, j'aimerais bien avoir une idée de la logique qui t'a amené à utiliser des indices décalés entre tes deux tableaux grilleUser et grilleValeur, ça rend ton code incompréhensible.
D'autre part, je ne suis pas expert en C, mais il me semble que tes &* devant compteurVictoire et j lors des appels de caseVide sont parfaitement inutiles. L'adresse de ce qui est pointé par un pointeur est donnée par le pointeur lui même.
Airox
Messages postés
146
Date d'inscription
Statut
Membre
Dernière intervention
13
Merci ! Tu viens de résoudre mon problème. Oui mon tableau est décalé de une case c'était pour compacter mon code et éviter une répétition de if lors de son initialisation mais quelqu'un m'a appris à créer un #define qui va m'éviter de faire plein de if. En tout cas grand merci !
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
1 584
merci de marquer la question comme résole