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 :

bug programme C


Sujet :

C

  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 3
    Par défaut bug programme C
    Bonsoir,

    Après avoir réfléchi pendant tout un week-end, je fais appel à ce forum afin de trouver de l'aide...

    J'ai un petit programme tout bête qui dois créer des joueurs dans un jeu de dada, tout le monde connais ça.

    De 1 à 4 joueurs... lorsque je sélectionne 4, il me demande le prénom du 1er, du second, du troisième et LA, il plante sans AUCUN message d'erreur, la fenêtre DOS se ferme seule. Aucune erreur lors de la compilatio, aucun warning...

    Qu'en pensez-vous ?


    Contenu du fichier main.c
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <time.h>
    #include <string.h>
     
    #include "cheval.h"
    #include "constantes.h"
     
    int main()
    {
    	srand(time(NULL));
     
    	// Déclarations des variables
    	int nbJoueurs = 0;
    	int typeJoueur = -1;
    	char *nomJoueur;
     
    	joueur joueur_1, joueur_2, joueur_3, joueur_4;
     
    	int i = 1;
     
    	// Liste des joueurs
    	joueur *listeJoueurs = NULL;
     
    	// Initialisation des escaliers
    	cheval matriceEscaliers[4][6];
     
    	// Demande du nombre de joueur total
    	while(nbJoueurs > 4 || nbJoueurs < 2){
    		system("cls");
    		printf("Combien de joueurs total (2-4) ?\n");
    		scanf("%d", &nbJoueurs);
    	}
     
    	while(i <= nbJoueurs){
    		if(i == 1){
    				// Création du 1er joueur (humain obligatoire)
    				printf("\n\nPrenom du joueur 1 (humain):\n");
    				scanf("%s", &nomJoueur);
    				joueur_1 = creationJoueur((char *)&nomJoueur, 0);
    				printf("Bienvenue %s !\n", joueur_1->nom);
            }
     
    		if(i == 2){
                // Création du 2ème joueur
                printf("\n\nJoueur 2 ?\n1 : Humain\n2 : Ordinateur\n");
                scanf("%d", &typeJoueur);
                if(typeJoueur == 1){
                    printf("Quel est le prenom du joueur 2 ?\n");
                    scanf("%s", &nomJoueur);
                    joueur_2 = creationJoueur((char *)nomJoueur, 0);
                }else{
                    joueur_2 = creationJoueur(NOM_JOUEUR_2, 1);
                }
                printf("Bienvenue %s !\n", joueur_2->nom);
    		}
     
    		if(i == 3){
                // Création du 3ème joueur
                printf("\n\nJoueur 3 ?\n1 : Humain\n2 : Ordinateur\n");
                scanf("%d", &typeJoueur);
                if(typeJoueur == 1){
                    printf("Quel est le prenom du joueur 3 ?\n");
                    scanf("%s", &nomJoueur);
                    joueur_3 = creationJoueur((char *)nomJoueur, 0);
                }else{
                    joueur_3 = creationJoueur(NOM_JOUEUR_3, 1);
                }
                printf("Bienvenue %s !\n", joueur_3->nom);
    		}
     
    		if(i == 4){
                // Création du 4ème joueur
                printf("\n\nJoueur 4 ?\n1 : Humain\n2 : Ordinateur\n");
                scanf("%d", &typeJoueur);
                if(typeJoueur == 1){
                    printf("Quel est le prenom du joueur 4 ?\n");
                    scanf("%s", &nomJoueur);
                    joueur_4 = creationJoueur((char *)nomJoueur, 0);
                }else{
                    joueur_4 = creationJoueur(NOM_JOUEUR_4, 1);
                }
                printf("Bienvenue %s !\n", joueur_4->nom);
            }
     
    		i++;
    	}
     
    	printf("%s\n", joueur_2->nom);
     
    	system("PAUSE");
     
    	return 0;
    }
     
     
     
    // ----------------------------
    // |                          |
    // |  FONCTIONS DU PROGRAMME  |
    // |                          |
    // ----------------------------
     
     
    // Cette fonction retourne un chiffre entre 1 et 6 (c'est un dé) :D
    int lancerDeDe(){
    	int valeur = 0;
        while(valeur == 0){
          int valeur = (int)(rand()%7);
        }
    }
     
     
    // La fonction suivante sert à créer un joueur
    joueur creationJoueur(char *nom, int bot){
     
    	joueur nouveau_joueur = malloc(sizeof(joueur));
     
    	nouveau_joueur->chevauxJouables = 4;
    	nouveau_joueur->chevauxEnclos = 4;
    	nouveau_joueur->caseDepart = 0;
    	nouveau_joueur->nom = nom;
    	nouveau_joueur->bot = bot;
    	nouveau_joueur->suivant = NULL;
     
    	return nouveau_joueur;
     
    }

    Contenu du fichier cheval.h
    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
     
    // -----------------------------
    // |                           |
    // |  STRUCTURES DU PROGRAMME  |
    // |                           |
    // -----------------------------
     
    // Cette structure représente un joueur et ses caractéristiques.
    struct t_joueur{
    	int chevauxJouables;				// 4 - Nbre de chevaux ayant gagné.
    	int chevauxEnclos;					// Nbre de chevaux restant dans l'enclos.
    	int caseDepart;							// Position de la case de départ. La case d'arrêt correspond à la case départ-1.
    	char *nom;									// Nom du joueur.
    	int bot;               			// A 1 si le joueur est un ordinateur, 0 sinon (humain).
    	struct t_joueur *suivant; 	// Pointeur permettant d'accéder au joueur suivant.
    };
     
    typedef struct t_joueur *joueur;
     
     
    // Cette structure représente un cheval et ses caractéristiques
    struct t_cheval{
    	joueur *proprietaire; 			// Pointeur vers le propriétaire du cheval
    	int position;         			// Position du cheval sur le plateau
    	int numero;           			// Numéro du cheval
    };
     
    typedef struct t_cheval *cheval;
     
     
    // Variables globales
     
    // Escaliers menant à la victoire
    cheval **matriceEscaliers;
     
    // Represente les cases du plateau de jeu
    cheval *tableauPlateau;
     
     
    // Prototypes de fonctions
     
    // Création d'un joueur
    // Retourne : un nouveau joueur
    joueur creationJoueur(char *nom, int bot);
     
    // Simule un lancement de dé.
    // Retourne : un chiffre entre 1 et 6.
    int lancerDeDe();
     
    // Positionne le cheval de l'enclos d'un joueur sur la case de départ
    // Param. : le joueur concerné
    // Retourne : le cheval en question
    cheval entrerChevalPlateau(int joueur);
     
    // Remet le cheval d'un joueur dans l'enclos
    // Param. : le cheval concerné
    // Retourne : un entier (1 : succès, 0 : échec)
    int sortirChevalPlateau(cheval leCheval);
     
    // Teste si un cheval du joueur est disponible dans l'enclos
    // Param. : le joueur concerné
    // Retourne : un entier (1 : disponible, 0 : non disponible)
    int chevalDispo(int joueur);
     
    // Teste la présence d'un cheval sur la case
    // Param. : la case concernée
    // Retourne : le cheval si trouvé
    cheval ChevalSurCase(int cellule);
     
    // Teste si le cheval est ami d'un joueur
    // Param. : le cheval/joueur concerné
    // Retourne : un entier (1 : ami, 0 : ennemi)
    int chevalAmi(cheval leCheval, joueur leJoueur);
     
    // Ajoute un nouveau joueur au plateau
    // Param. : Nom du joueur, un entier (1 : bot, 0 : humain)
    void ajouterJoueur(char* nom, int bot);
     
    // Ajout d'un vainqueur à la liste des gagnants
    // Param. : le joueur concerné
    void victoireJoueur(joueur leJoueur);
     
    // Positionne un cheval sur la 1ere marche de ses escaliers
    // Param. : le cheval concerné
    void entrerChevalEscaliers(cheval leCheval);
     
    // Sort un cheval de ses escaliers
    // Param. : le cheval concerné
    void sortirChevalEscaliers(cheval leCheval);
     
    // Déplace un cheval sur ses escaliers d'une case
    // Param. : le cheval concerné, le score du dé (entier de 1 à 6)
    // Conditions : la valeur de scoreDe doit répondre aux règles du jeu.
    void deplacerChevalEscaliers(cheval leCheval, int scoreDe);
     
    // Déplace un cheval sur le plateau de jeu de scoreDe case
    // Param. : le cheval concerné, le score du dé (entier de 1 à 6);
    void deplacerChevalPlateau(cheval leCheval, int scoreDe);

    Contenu du fichier constantes.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    /*
    constantes.h
    ------------
     
    Rôle : définit des constantes communes à tout le programme
    */
     
    #define NOM_JOUEUR_2 "Christophe"
    #define NOM_JOUEUR_3 "Mathieu"
    #define NOM_JOUEUR_4 "Gwnenog"
    Lorsque je mets ces lignes suivantes en commentaires, ça passe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //joueur_3 = creationJoueur((char *)nomJoueur, 0);
    //joueur_3 = creationJoueur(NOM_JOUEUR_3, 1);
    //printf("Bienvenue %s !\n", joueur_3->nom);
    Autrement ça ne passe pas, le programme se ferme de lui-même...


    Avez-vous déjà rencontrer ce type de bug ?

    Si oui, que faire ?

    Merci à tous ceux qui répondrant,
    Thomas

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 52
    Par défaut
    Ta variable nomjoueur est declarée comme un pointeur.
    Avant de t'en servir, il faut lui allouer de la mémoire (malloc), ou la faire pointer sur une zone mémoire valide.

    Tu auras le même problème dans ta fonction de création d'un joueur

    Enfin pour copier une chaine, utilise strcpy.

  3. #3
    Candidat au Club
    Inscrit en
    Novembre 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 3
    Par défaut
    Pourtant le programme fonctionne très très bien avec la création des deux premiers joueurs.

    Les printf("%s', joueur_2->nom) et pour le joueur_1 me retournent bien les prénoms que j'ai tapé...

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par thomas_44 Voir le message
    Pourtant le programme fonctionne très très bien avec la création des deux premiers joueurs.

    Les printf("%s', joueur_2->nom) et pour le joueur_1 me retournent bien les prénoms que j'ai tapé...
    Si tu mets en doute la réponse, va voir ailleurs. On te dit que tu utilises un pointeur non initialisé. Le comportement est donc indéterminé. Tout peut arriver. Ce n'est pas parce que ça à l'air de fonctionner que ça fonctionne.

    Apprend donc les bases du C avant de venir mettre en cause les réponses reçues. Pas possible de voir ça...
    Aucune erreur lors de la compilatio, aucun warning...
    Et apprends à régler ton compilateur, ça t'éviteras de venir te ridiculiser en public.
    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
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    In file included from main.c:8:
    cheval.h:48: warning: function declaration isn't a prototype
    main.c:12: warning: function declaration isn't a prototype
    main.c: In function `main':
    main.c:41: warning: char format, pointer arg (arg 2)
    main.c:52: warning: char format, pointer arg (arg 2)
    main.c:55: warning: passing arg 1 of `creationJoueur' discards qualifiers from pointer target type
    main.c:66: warning: char format, pointer arg (arg 2)
    main.c:69: warning: passing arg 1 of `creationJoueur' discards qualifiers from pointer target type
    main.c:80: warning: char format, pointer arg (arg 2)
    main.c:83: warning: passing arg 1 of `creationJoueur' discards qualifiers from pointer target type
    main.c:25: warning: unused variable `listeJoueurs'
    main.c:28: warning: unused variable `matriceEscaliers'
    main.c:20: warning: 'joueur_2' might be used uninitialized in this function
    main.c: At top level:
    main.c:108: warning: function declaration isn't a prototype
    main.c: In function `lancerDeDe':
    main.c:111: warning: unused variable `valeur'
    main.c:113: warning: control reaches end of non-void function
    Linking console executable: console.exe
    Process terminated with status 0 (0 minutes, 2 seconds)
    0 errors, 15 warnings

  5. #5
    Candidat au Club
    Inscrit en
    Novembre 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 3
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Si tu mets en doute la réponse, va voir ailleurs. On te dit que tu utilises un pointeur non initialisé. Le comportement est donc indéterminé. Tout peut arriver. Ce n'est pas parce que ça à l'air de fonctionner que ça fonctionne.

    Apprend donc les bases du C avant de venir mettre en cause les réponses reçues. Pas possible de voir ça...

    Et apprends à régler ton compilateur, ça t'éviteras de venir te ridiculiser en public.
    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
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    In file included from main.c:8:
    cheval.h:48: warning: function declaration isn't a prototype
    main.c:12: warning: function declaration isn't a prototype
    main.c: In function `main':
    main.c:41: warning: char format, pointer arg (arg 2)
    main.c:52: warning: char format, pointer arg (arg 2)
    main.c:55: warning: passing arg 1 of `creationJoueur' discards qualifiers from pointer target type
    main.c:66: warning: char format, pointer arg (arg 2)
    main.c:69: warning: passing arg 1 of `creationJoueur' discards qualifiers from pointer target type
    main.c:80: warning: char format, pointer arg (arg 2)
    main.c:83: warning: passing arg 1 of `creationJoueur' discards qualifiers from pointer target type
    main.c:25: warning: unused variable `listeJoueurs'
    main.c:28: warning: unused variable `matriceEscaliers'
    main.c:20: warning: 'joueur_2' might be used uninitialized in this function
    main.c: At top level:
    main.c:108: warning: function declaration isn't a prototype
    main.c: In function `lancerDeDe':
    main.c:111: warning: unused variable `valeur'
    main.c:113: warning: control reaches end of non-void function
    Linking console executable: console.exe
    Process terminated with status 0 (0 minutes, 2 seconds)
    0 errors, 15 warnings
    He ben he ben... pardonne moi de t'avoir offencé...

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/06/2011, 14h13
  2. Bug programme de Lecture fichier
    Par Bulveye dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 04/06/2010, 23h21
  3. [MySQL] Bug programmation PHP MySQL
    Par hallucine dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 01/07/2008, 09h45
  4. Lenteur d'exécution et bug programme
    Par matt67 dans le forum MATLAB
    Réponses: 3
    Dernier message: 06/06/2007, 16h01
  5. Bug programme Delphi sur certains XP
    Par Philippe85 dans le forum Delphi
    Réponses: 11
    Dernier message: 13/12/2006, 11h51

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