IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Bataille navale qui seg fault


Sujet :

C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2010
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2010
    Messages : 30
    Points : 25
    Points
    25
    Par défaut Bataille navale qui seg fault
    Bonjour,

    J'ai finis un projet d'informatique, la bataille navale, il ne me reste plus qu'à faire une meilleure présentation du jeu.
    Mon soucis c'est que lorsque je commence à entrer les coordonnées des placements des tirs, un message d'erreur de WINDOWS s'affiche, alors que je le compilateur indique aucun erreur.

    Voici le code (ne faites pas aux erreurs d'orthographe dans les commentaires ^^) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    /*
    Algo : Bataille navale
    Derniere modification : 22/12/12
    */
     
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
     
     
     
    const int NBJoueurs = 2, NBLignes = 5, NBBateaux = 4, LongNom = 12, NBColonne = 5;
    const int INIT = -1, BATEAU = 1, tir = 2, coule = 3;
     
     
    void saisirlesNoms (char n[NBJoueurs][LongNom]);
    void afficherlesNoms (char n[NBJoueurs][LongNom]);
    void initialisertableau (int t[NBJoueurs] [NBLignes] [NBColonne]);
    void initialiserBateau (int t[NBJoueurs] [NBLignes] [NBColonne]);
    void affPlateau(int t[NBJoueurs] [NBLignes] [NBColonne], int numj);
    void affTir(int t[NBJoueurs] [NBLignes] [NBColonne],int tj[NBJoueurs] [NBLignes] [NBColonne], int numj);
    bool fTesterFinJeu(int tj[NBJoueurs] [NBLignes] [NBColonne],int numjoueur);
    int fJoueurSuivant(int numj);
     
     
    int main()
    {
     
        char nom[NBJoueurs][LongNom]; // mémorisation des noms
        int plateau[NBJoueurs] [NBLignes] [NBColonne]; // plateau de jeu
        int tir[NBJoueurs] [NBLignes] [NBColonne]; // plateau des tirs
     
        int numjoueur; // numero du joueur actuel
        int reponse; // saisie pour poursuite du jeu
     
        bool jeuPasTermine;
     
        /* INITIALISATION */
     
        saisirlesNoms(nom);
        afficherlesNoms(nom);
     
        do {
     
            initialisertableau(plateau); // raz du plateau
            initialiserBateau(plateau); // saisir les bateau
            initialisertableau(tir); // raz des tirs
     
            jeuPasTermine = true;
     
            numjoueur = 0;
     
            while (jeuPasTermine) {
                system("cls");
                // rechercher le joueur suivant
                numjoueur = fJoueurSuivant(numjoueur);
                printf("\n%s",nom[numjoueur]);
     
                // afficher les plateau de jeu et de tir
                affPlateau(plateau, numjoueur);
                printf("\nTirs :");
                affPlateau(tir, numjoueur);
     
                // demander la saisie du tir
                // demander un numero de ligne et de colonne
                 // mémoriser ce tir dans le tableau de tir du joueur
                 affTir(tir,plateau, numjoueur);
     
                // tester si c'est la fin du jeu
                 jeuPasTermine = fTesterFinJeu(plateau, numjoueur);
     
            }
     
            printf("\nla gagnant : %s",nom[numjoueur]);
     
           printf("continuer ? 1=oui; 0=non");
            scanf("%d",&reponse);
         } while (reponse==1);
     
        return 0;
    }
     
     
    void saisirlesNoms (char n[NBJoueurs][LongNom]) {
        int i;
        for(i=0;i<NBJoueurs;i++) {
            printf("Saisir un nom : ");
            scanf("%s",n[i]);
        }
    }
     
    void afficherlesNoms (char n[NBJoueurs][LongNom]) {
        int i;
        for(i=0;i<NBJoueurs;i++) {
            printf("\nnom joueur %d est %s ",i+1,n[i]);
        }
    }
     
    void initialisertableau (int t[NBJoueurs] [NBLignes] [NBColonne]) {
       int i;
       int j;
       int k;
     
     
       for(i=0;i<NBJoueurs;i++) {
           for (j=0;j<NBLignes;j++) {
              for (k=0;k<NBColonne;k++) {
               t[i][j][k] = INIT;
              }
           }
       }
      }
     
    void initialiserBateau (int t[NBJoueurs] [NBLignes] [NBColonne]) {
       int i;
       int j;
       int x;
       int y;
     
       for(i=0;i<NBJoueurs;i++) {
           printf("\njoueur %d :",i);
           for (j=0;j<NBBateaux;j++)
           {
               printf("\nSaisir les coordonnes x y du bateau");
               scanf("%d %d",&x,&y);
               t[i][x][y] = BATEAU;
               }
            affPlateau(t, i);
            }
    }
     
     
     
    void affPlateau(int t[NBJoueurs] [NBLignes] [NBColonne], int numj) {
        int j,k;
          for (j=0;j<NBLignes;j++) {
            printf("\n");
              for (k=0;k<NBColonne;k++) {
                  printf("! ");
                  if (t[numj][j][k] == INIT)
                     printf(".");
                    else if (t[numj][j][k] == BATEAU )
                        printf("B");
                    else if (t[numj][j][k] == tir )
                        printf("T");
                    else if (t[numj][j][k] == coule )
                        printf("C");
                    printf(" ");
              }
              printf("!");
              printf("\n");
              for(k=1;k<=NBColonne;k++)
                printf("----");
          }
    }
     
    void affTir(int t[NBJoueurs] [NBLignes] [NBColonne], int tj[NBJoueurs] [NBLignes] [NBColonne], int numj) {
       int j,k;
       int x;
       int y;
     
               printf("\nSaisir les coordonnes x y du tir");
               scanf("%d %d",&x,&y);
               t[numj][x][y] = tir;
     
               if(tj[fJoueurSuivant(numj)][x][y]==BATEAU) {
                    printf("coule en %d %d",x,y);
                    tj[fJoueurSuivant(numj)][x][y]=coule;
               }
    //           }
    //        affTir(t, i);
    //        }
          for (j=0;j<NBLignes;j++) {
            printf("\n");
              for (k=0;k<NBColonne;k++) {
                  if (t[numj][j][k] == INIT)
                     printf(".");
                    else if (t[numj][j][k] == tir)
                        printf("T");
              }
          }
    }
     
    int fJoueurSuivant(int numj) {
        if (numj==0) return 1;
        else return 0;
    }
     
    /*
    Si un joueur a tous ses bateaux coulés alors jeu pasterminé = faux
     
    la fonction attend/reçoit
    - un plateau
    - le numero du joueur qui a joué
     
    Elle va compter le nombre de bateaux du joueur suivant
     
    si le nombre de batreau est à 0, elle retourne faux (fin du jeu) sinon vrai
     
     
    */
    bool fTesterFinJeu(int tj[NBJoueurs] [NBLignes] [NBColonne],int numjoueur) {
        // compter le nombre de bateaux du joueur qui suit
        int ct=0,i,j, x,y;
         for (i=0;i<NBLignes;i++) {
            for (j=0;j<NBColonne; j++ ) {
              if (tj[fJoueurSuivant(numjoueur)][x][y]==BATEAU) ct=ct+1;
            }
         }
         if (ct==0) {
           return false;
         }
        else {
           return true;
         }
    }
    Merci beaucoup

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    un message d'erreur de WINDOWS s'affiche,
    Il dit quelque chose ce message, ce peut être utile de savoir quoi.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2010
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2010
    Messages : 30
    Points : 25
    Points
    25
    Par défaut
    bataille.exe a cessé de fonctionné.
    Le programme a cessé de fonctionné.


    Juste ça

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Cannot Voir le message
    Bonjour,

    ...
    Mon soucis c'est que lorsque je commence à entrer les coordonnées des placements des tirs, un message d'erreur de WINDOWS s'affiche, alors que je le compilateur indique aucun erreur.
    Salut

    Un programme qui se compile n'est pas un programme exempt d'erreur. Le compilo te dit juste que ta syntaxe est correcte est que l'édition des liens entre les différents fonctions se fait aussi. En revanche il ne peut pas détecter les erreurs de logique et de gestion mémoire...

    Exemple de programme qui compile mais qui risque fortement d'avoir lui-aussi un message un jour...
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main()
    {
        char toto[1]="Hello";
        int i;
     
        for (i=-5; i < 15; i++)
            printf("toto[%d]=%c\n", i, toto[i]);
    }

    Citation Envoyé par diogene Voir le message
    Il dit quelque chose ce message, ce peut être utile de savoir quoi.
    +1...

    Citation Envoyé par Cannot Voir le message
    bataille.exe a cessé de fonctionné.
    Le programme a cessé de fonctionné.


    Juste ça
    [edit]
    Bon ben commence à mettre des printf() un peu partout, notamment dans la fonction qui semble incriminée (la saisie des navires semble-t-il...)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Dans la fonction fTesterFinJeu, les variables x et y ne sont jamais initialisés, tu vas donc lire n'importe où en mémoire (je soupçonne un mélange entre i,j et x,y dans cette fonction).

    Mais un compilateur correctement réglé (i.e. avec les warnings activés) l'indique :

    C:\data\Workspace\C\DVP\main.c||In function 'main'
    C:\data\Workspace\C\DVP\main.c|32|warning: declaration of 'tir' shadows a global declaration [-Wshadow]|
    C:\data\Workspace\C\DVP\main.c|14|warning: shadowed declaration is here [-Wshadow]|
    C:\data\Workspace\C\DVP\main.c||In function 'fTesterFinJeu'
    C:\data\Workspace\C\DVP\main.c|208|warning: 'x' may be used uninitialized in this function [-Wuninitialized]|
    C:\data\Workspace\C\DVP\main.c|208|warning: 'y' may be used uninitialized in this function [-Wuninitialized]|
    ||=== Build finished: 0 errors, 4 warnings (0 minutes, 2 seconds) ===|

  6. #6
    Membre éclairé
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Points : 807
    Points
    807
    Par défaut
    Bonjour,

    À force d'utiliser les VLA, tu vas faire exploser ta pile.
    De plus, quand je tourne ton code sur un débogueur, j'ai des variables qui ne sont pas initialisées. Fais de même, tu verras que ton programme sera plus simple à corriger.

    Bonne journée.
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    ^Normalement, il n'y a pas de VLAs ici, ou du moins il ne devrait pas y en avoir. Malheureusement je ne sais plus comment les variables constantes connues à la compilation marchent en C99 (par opposition au C++), donc si ça se trouve ce sont des VLAs quand même.

    À propos de x et y: La plus grosse erreur est de les utiliser directement après une entrée pour indexer un tableau, sans validation d'aucune sorte: Commence par vérifier qu'ils sont OK:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    /* Lit jusqu'au \n inclus */
    int fpurge(FILE *pfIn)
    {
    	int c;
    	while((c=fgetc(pfIn))!='\n' && c!=EOF)
    	{ }
    	return (c==EOF ? -1 : 0);
    }
     
    void affTir(int t[NBJoueurs] [NBLignes] [NBColonne], int tj[NBJoueurs] [NBLignes] [NBColonne], int numj) {
    	int j,k;
    	int x;
    	int y;
    	do {
    		int resScanf;
    		printf("\nSaisir les coordonnes x y du tir");
    		resScanf = scanf("%d %d", &x, &y);
    		fpurge(stdin);
    	} while(resScanf!=2 || !(x>=0 && x<NBLignes) || !(y>=0 && y<NBColonne));
    	...
    Note pour moi-même: J'ai récupérer fpurge de ce post.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre éclairé
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Points : 807
    Points
    807
    Par défaut
    Bonjour,

    Citation Envoyé par Médinoc Voir le message
    ^Normalement, il n'y a pas de VLAs ici, ou du moins il ne devrait pas y en avoir. Malheureusement je ne sais plus comment les variables constantes connues à la compilation marchent en C99 (par opposition au C++), donc si ça se trouve ce sont des VLAs quand même.
    Le qualificateur const du C n'est pas typé de la même manière qu'en C++ (en ce sens, il n'a pas la même sémantique). La taille d'un tableau doit être spécifiée à partir d'une constante entière, mais le fait est que const est mal nommé : il ne conduit pas à une variable constante à proprement dit (on pourrait l'apparenter à une lecture seule, mais évaluée au runtime). Un tel tableau est donc bien un VLA en C (*). C'est aussi pourquoi on utilise cette technique beaucoup moins souvent qu'en C++.

    Bonne journée.

    (*) : Enfin, c'est principalement de la théorie. Il me semble qu'il existe certaines extensions (mais alors ça devient un mix dégueulasse entre C et C++) qui autorisent l'utilisation des const int en tant que taille de tableau, tout en ne supportant que le C89 (c'est le cas de VS2008).
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Dans ce cas, la meilleure chose à faire pour être sûr que ce ne soit pas des VLA, c'est remplacer toutes ces variables const par des #define?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre éclairé
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Points : 807
    Points
    807
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Dans ce cas, la meilleure chose à faire pour être sûr que ce ne soit pas des VLA, c'est remplacer toutes ces variables const par des #define?
    Tout à fait. Simplement, j'aurais tendance à conseiller davantage les énumérations quand il s'agit de constantes numériques (sauf si on veut faire du préprocesseur dessus), mais, dans l'ensemble, c'est effectivement ce que je cherchais implicitement à dire dans mon premier message.
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2010
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2010
    Messages : 30
    Points : 25
    Points
    25
    Par défaut
    Oui j'ai corrigé ça, donc plus de bug, merci.

    Mais maintenant j'ai déceler un autre problème, le compteur "ct" de ma fonction suivante ne marche pas, donc si je place seulement un bateau, pas de soucis, le jeu se termine si ce-dernier a été coulé, mais si je passe à 2 bateaux, il me suffit que je coule un bateau pour que le jeu s'arrête, donc sa retourne vrai :

    Voici le problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    bool fTesterFinJeu(int tj[NBJoueurs] [NBLignes] [NBColonne],int numjoueur) {
        // compter le nombre de bateaux du joueur qui suit
        int ct=0,i,j;
        int x = 0, y = 0;
         for (i=0;i<NBLignes;i++) {
            for (j=0;j<NBColonne; j++ ) {
              if (tj[fJoueurSuivant(numjoueur)][x][y]==BATEAU) {
                  ct=ct+1;
                  }
            }
         }
         if (ct==NBBateaux) {
           return true;
         }
        else {
           return false;
         }
    }

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2010
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2010
    Messages : 30
    Points : 25
    Points
    25
    Par défaut
    Ce n'est pas la fonction booléenne qui ne marche pas, car j'ai étudié une autre possibilité de tester le jeu est toujours le même soucis
    Voici l'autre possibilité (en commentaire l'ancienne méthode) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    bool fTesterFinJeu(int tj[NBJoueurs] [NBLignes] [NBColonne],int numj) {
        // compter le nombre de bateaux du joueur qui suit
      /*  int ct=0,i,j;
        int x = 0, y = 0;
         for (i=0;i<NBLignes;i++) {
            for (j=0;j<NBColonne; j++ ) {
              if (tj[fJoueurSuivant(numj)][x][y]==BATEAU) {
                  ct=ct+1;
                  }
     
         }*/
         int batcoul = 0;
         int x = 0, y=0;
         if(tj[fJoueurSuivant(numj)][x][y]==BATEAU) {
                         batcoul = 1 + batcoul; }
         if (batcoul==NBBateaux) {
           return true; }
     
           else {
           return false;
         }
      }
    Par contre j'inverse true et false, là il se passe quelque chose qui semble logique puisque la boucle de la fonction principale devient infinie, donc je ne sais vraiment pas d'où vient le problème.

  13. #13
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Tu as bien initialisé les variables x et y dans cette fonction, mais tu n'en as pas profité pour regarder à quoi elles servaient !
    En fait, elle restent à 0 et cette ligne est plus que suspecte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (tj[fJoueurSuivant(numjoueur)][x][y]==BATEAU) {
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2010
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2010
    Messages : 30
    Points : 25
    Points
    25
    Par défaut
    J'ai mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (tj[fJoueurSuivant(numj)][i][j]==BATEAU)
    Mais toujours le même soucis, malgré d'autres essais

  15. #15
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jeuPasTermine = fTesterFinJeu(plateau, numjoueur);
    Alors que la fonction renvoie 'jeuTermine'
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  16. #16
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2010
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2010
    Messages : 30
    Points : 25
    Points
    25
    Par défaut
    Si fTesterFinJeu retourne vrai alors jeuPasTermine retourne vrai

  17. #17
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2010
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2010
    Messages : 30
    Points : 25
    Points
    25
    Par défaut
    Ouf' j'ai réussi tout fonctionne !!!

    J'ai repris une sauvegarde de ma bataille d'il y a une semaine, et en partant de vos indications (en remplaçant X Y par I J et en initialisant), juste ça ^^
    En fait, depuis ce matin je changais mon code à chaque fois en faisant des tests et je devais travailler sur des erreurs ...

    Merci !
    J'ai enfin fini, il ne reste plus qu'à faire la forme.


    Bonnes fêtes ! , j'aurai peut-être encore besoin de votre aide, j'ai encore un second projet avec un démineur .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Programme qui plante : seg fault
    Par Premium dans le forum C
    Réponses: 10
    Dernier message: 01/12/2006, 15h12
  2. [fclose] erreur de fermeture (seg fault)
    Par Goundy dans le forum C
    Réponses: 17
    Dernier message: 06/04/2006, 13h16
  3. probleme de valeur retournée et seg fault
    Par florent_de_brest dans le forum C
    Réponses: 5
    Dernier message: 04/12/2005, 16h28
  4. bataille navale
    Par keenurives dans le forum C
    Réponses: 7
    Dernier message: 21/11/2005, 12h15
  5. [LG]Programme Bataille Navale en Pascal
    Par RaFaL dans le forum Langage
    Réponses: 21
    Dernier message: 10/06/2003, 21h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo