Problème de fonction qui plante

Résolu/Fermé
Airox Messages postés 146 Date d'inscription vendredi 1 août 2014 Statut Membre Dernière intervention 5 novembre 2018 - 18 déc. 2016 à 00:18
yg_be Messages postés 22696 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 avril 2024 - 18 déc. 2016 à 12:45
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:
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

1 réponse

Utilisateur anonyme
18 déc. 2016 à 09:21
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.
0
Airox Messages postés 146 Date d'inscription vendredi 1 août 2014 Statut Membre Dernière intervention 5 novembre 2018 13
18 déc. 2016 à 12:17
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 !
0
yg_be Messages postés 22696 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 avril 2024 1 471
18 déc. 2016 à 12:45
merci de marquer la question comme résole
0