Soutenez-nous
Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 17 sur 17
  1. #1
    Invité de passage
    Profil pro Rémi Cannot
    Prépa
    Inscrit en
    septembre 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Nom : Rémi Cannot

    Informations professionnelles :
    Activité : Prépa

    Informations forums :
    Inscription : septembre 2010
    Messages : 16
    Points : 3
    Points
    3

    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 :
    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
    Responsable Modération
    Avatar de diogene
    Homme Profil pro Patrick Gonord
    Enseignant Chercheur
    Inscrit en
    juin 2005
    Messages
    5 665
    Détails du profil
    Informations personnelles :
    Nom : Homme Patrick Gonord
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : juin 2005
    Messages : 5 665
    Points : 12 545
    Points
    12 545

    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
    Invité de passage
    Profil pro Rémi Cannot
    Prépa
    Inscrit en
    septembre 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Nom : Rémi Cannot

    Informations professionnelles :
    Activité : Prépa

    Informations forums :
    Inscription : septembre 2010
    Messages : 16
    Points : 3
    Points
    3

    Par défaut

    bataille.exe a cessé de fonctionné.
    Le programme a cessé de fonctionné.


    Juste ça

  4. #4
    Expert Confirmé Sénior
    Avatar de Sve@r
    Homme Profil pro Frédéric
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    4 174
    Détails du profil
    Informations personnelles :
    Nom : Homme Frédéric
    Âge : 45
    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 : 4 174
    Points : 8 007
    Points
    8 007

    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 :
    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...)
    Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
    Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
    Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
    Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
    Dr. Adrian Rogers, 1931

  5. #5
    gl
    gl est déconnecté
    Rédacteur/Modérateur

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

    Informations forums :
    Inscription : juin 2002
    Messages : 2 077
    Points : 3 894
    Points
    3 894

    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 chevronné
    Avatar de Kirilenko
    Homme Profil pro Lucas Pesenti
    Étudiant
    Inscrit en
    décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Nom : Homme Lucas Pesenti
    Âge : 17
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2011
    Messages : 234
    Points : 766
    Points
    766

    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 Confirmé Sénior Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    23 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France

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

    Informations forums :
    Inscription : septembre 2005
    Messages : 23 617
    Points : 31 176
    Points
    31 176

    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 :
    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 chevronné
    Avatar de Kirilenko
    Homme Profil pro Lucas Pesenti
    Étudiant
    Inscrit en
    décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Nom : Homme Lucas Pesenti
    Âge : 17
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2011
    Messages : 234
    Points : 766
    Points
    766

    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 Confirmé Sénior Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    23 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France

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

    Informations forums :
    Inscription : septembre 2005
    Messages : 23 617
    Points : 31 176
    Points
    31 176

    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 chevronné
    Avatar de Kirilenko
    Homme Profil pro Lucas Pesenti
    Étudiant
    Inscrit en
    décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Nom : Homme Lucas Pesenti
    Âge : 17
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2011
    Messages : 234
    Points : 766
    Points
    766

    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
    Invité de passage
    Profil pro Rémi Cannot
    Prépa
    Inscrit en
    septembre 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Nom : Rémi Cannot

    Informations professionnelles :
    Activité : Prépa

    Informations forums :
    Inscription : septembre 2010
    Messages : 16
    Points : 3
    Points
    3

    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 :
    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
    Invité de passage
    Profil pro Rémi Cannot
    Prépa
    Inscrit en
    septembre 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Nom : Rémi Cannot

    Informations professionnelles :
    Activité : Prépa

    Informations forums :
    Inscription : septembre 2010
    Messages : 16
    Points : 3
    Points
    3

    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 :
    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
    Responsable Modération
    Avatar de diogene
    Homme Profil pro Patrick Gonord
    Enseignant Chercheur
    Inscrit en
    juin 2005
    Messages
    5 665
    Détails du profil
    Informations personnelles :
    Nom : Homme Patrick Gonord
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : juin 2005
    Messages : 5 665
    Points : 12 545
    Points
    12 545

    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 :
    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
    Invité de passage
    Profil pro Rémi Cannot
    Prépa
    Inscrit en
    septembre 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Nom : Rémi Cannot

    Informations professionnelles :
    Activité : Prépa

    Informations forums :
    Inscription : septembre 2010
    Messages : 16
    Points : 3
    Points
    3

    Par défaut

    J'ai mis
    Code :
    if (tj[fJoueurSuivant(numj)][i][j]==BATEAU)
    Mais toujours le même soucis, malgré d'autres essais

  15. #15
    Responsable Modération
    Avatar de diogene
    Homme Profil pro Patrick Gonord
    Enseignant Chercheur
    Inscrit en
    juin 2005
    Messages
    5 665
    Détails du profil
    Informations personnelles :
    Nom : Homme Patrick Gonord
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : juin 2005
    Messages : 5 665
    Points : 12 545
    Points
    12 545

    Par défaut

    Code :
    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
    Invité de passage
    Profil pro Rémi Cannot
    Prépa
    Inscrit en
    septembre 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Nom : Rémi Cannot

    Informations professionnelles :
    Activité : Prépa

    Informations forums :
    Inscription : septembre 2010
    Messages : 16
    Points : 3
    Points
    3

    Par défaut

    Si fTesterFinJeu retourne vrai alors jeuPasTermine retourne vrai

  17. #17
    Invité de passage
    Profil pro Rémi Cannot
    Prépa
    Inscrit en
    septembre 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Nom : Rémi Cannot

    Informations professionnelles :
    Activité : Prépa

    Informations forums :
    Inscription : septembre 2010
    Messages : 16
    Points : 3
    Points
    3

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •