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 :

Jeu du pendu, compilation réussie mais plantage au lancement


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Redgard
    Homme Profil pro
    x
    Inscrit en
    Décembre 2014
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : x

    Informations forums :
    Inscription : Décembre 2014
    Messages : 90
    Par défaut Jeu du pendu, compilation réussie mais plantage au lancement
    Bonjour,

    M'entrainant en C, j'ai fait un petit jeu consistant à trouver un mot caché en moins de 10 coups. Or si la compilation s'est finalement bien passé, le programme plante au lancement.
    Je pense que c'est un problème lié à un pointeur, au niveau de la fonction SizeAllocatorTxt. Ce que je ne comprend pas c'est que j'avais testé cette fonction séparément et quelle marchait :/ .

    Nom : C1.PNG
Affichages : 324
Taille : 16,7 Ko

    ça plante au niveau de la ligne 111 printf("> Le mot secret est : %s \n", *hiddenWord);.

    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 <ctype.h>
    #include <stdlib.h>
    
    #pragma warning(disable : 4996)
    
    // ========== HEADER ==========
    char EnterChar(void);
    int SizeCalculator(char *word);
    char* SizeAllocatorTxt(const int sizeTab);
    void WordHider(char mysteryWord[], char hiddenWord[]);
    int WordComparator(char *compared, char comparator, char *hiddenWord);
    void MysteryWordGame(char *mysteryWord);
    
    // ========== MAIN ==========
    int main() 
    {
    	char mysteryWord[25] = "TEST";
    	
    	MysteryWordGame(mysteryWord);
    
    	return 0;
    }
    
    // ========== SECONDARY ==========
    
    char EnterChar(void)
    {
    	char character = 0;
    
    	while (1)
    	{
    		puts("Entrez un lettre: ");
    
    		char entry[50 + 1];
    		fgets(entry, 50 + 1, stdin);
    
    		if (sscanf(entry, "%c\n", &character) == 1)
    		{
    			character = toupper(character);
    			break;
    		}
    
    		puts("! Entree incorrecte - Veuillez entrer une lettre. Recommencez.\n");
    	}
    
    	return character;
    }
    
    int SizeCalculator(char *word)
    {
    	int iteration = 0;
    
    	for (int i = 0; word[i] != '\0'; i++)
    	{
    		iteration++;
    	}
    
    	return iteration;
    }
    
    char* SizeAllocatorTxt(const int sizeTab)
    {
    	return (char *)malloc(sizeof(char) * (sizeTab + 1));
    }
    
    void WordHider(char mysteryWord[], char hiddenWord[]) 
    {
    	for (int i = 0; mysteryWord[i] != '\0'; i++)
    	{
    		hiddenWord[i] = '*';
    	}
    }
    
    int WordComparator(char *compared, char comparator, char *hiddenWord)
    {
    	int similarity = 0;
    
    	for (int i = 0; compared[i] != '\0'; i++)
    	{
    		if (compared[i] == comparator)
    		{
    			hiddenWord[i] = comparator;
    			similarity = 1;
    		}
    	}
    
    	// if similarity is false (0), return false (0), else return true(1) 
    	if (similarity = 0) return 0;
    	else return 1;
    }
    
    void MysteryWordGame(char *mysteryWord) 
    {
    	int numbLife = 10, sizeWord = 0;
    	char *hiddenWord = NULL;
    	
    	//calculate the size of the mystery word
    	sizeWord = SizeCalculator(mysteryWord);
    
    	//allocate memory for hidden word
    	hiddenWord = SizeAllocatorTxt(sizeWord);
    
    	//hidde the mystery word
    	WordHider(mysteryWord, hiddenWord);
    
    	//gameloop
    	while (1)
    	{
    		printf("> Il vous reste %d coups a jouer.\n", numbLife);
    		printf("> Le mot secret est : %s \n", *hiddenWord);
    
    		char characterEnter = EnterChar();
    
    		if (WordComparator(mysteryWord, characterEnter, hiddenWord) == 0) numbLife--;
    
    		if (numbLife == 0)
    		{
    			puts("You Lose!\n");
    			break;
    		}
    		if (*mysteryWord == *hiddenWord)
    		{
    			puts("You win!\n");
    			break;
    		}
    	}
    	
    	free(hiddenWord);
    }


    Test de la fonction SizeAllocatorTxt:
    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    #pragma warning(disable : 4996)
     
    // ========== FUNCTION ==========
    char* SizeAllocatorTxt(const int sizeTab)
    {
    	return (char *)malloc(sizeof(char) * (sizeTab + 1));
    }
     
    // ========== TEST ==========
    void PauseApp(void);
     
    int main() {
    	char* pWord = NULL;
    	int size = 4;
     
    	pWord = SizeAllocatorTxt(size);
     
    	if (pWord == NULL)
    	{
    		puts("Echec de l'allocation de memoire.\n");
     
    		PauseApp();
    		return 0;
    	}
     
    	strcpy(pWord, "cinq");
     
    	printf("the word is %s\n", pWord);
     
    	free(pWord);
     
    	PauseApp();
    	return 0;
    }
     
    // ========== SECONDARY ==========
    // fonction de pause du programme - demande une validation pour continuer
    void PauseApp(void) {
    	do {
    		puts("\n> Appuyez sur 'Entree' pour terminer le programme. \n");
    	} while (getchar() != '\n');
    }
    Nom : C2.PNG
Affichages : 292
Taille : 8,7 Ko

    Merci d'avance,
    Red'

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    il ne faut pas utiliser l'étoile, dans printf("> Le mot secret est : %s \n", *hiddenWord);. La fonction nécessite un pointeur sur des caractères.
    Et ces caractères doivent avoir un '\0' terminateur et tu as oublié de l'ajouter dans le fonction WordHider().

  3. #3
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Ton compilateur devrait émettre les avertissements correspondant à ce type d'erreurs pour peu qu'il soit configuré correctement. Pour GCC il est nécessaire d'ajouter -pedantic -Wall -Wextra -Wconversion à la commande de compilation, par exemple.

    Ton code doit toujours compiler sans aucun warning.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Avec if (*mysteryWord == *hiddenWord) dès que je trouve la première lettre j'ai gagné.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre confirmé Avatar de Redgard
    Homme Profil pro
    x
    Inscrit en
    Décembre 2014
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : x

    Informations forums :
    Inscription : Décembre 2014
    Messages : 90
    Par défaut
    ha! effictevement! my bad!

    C'est effectivement bizarre que le compilateur de visual studio ne me revoit pas un warning :/ ...

    J'ai un autre problème ("=²²²²"), est-ce que ça serait lié au caractère '*' que j'utilise pour cacher le mot? En remplaçant par des carrés, j'obtiens une réponse légèrement différentes...
    Nom : C1.PNG
Affichages : 259
Taille : 12,5 Ko
    Nom : C2.PNG
Affichages : 262
Taille : 4,1 Ko

    il semble que quand je tappe 'T' (le mot mystère étant "TEST"), ça interromp mon programme prématurément.
    EDIT: le poste de Bousk explique le problème du "T"
    J'ai réglé le problème avec la ligne suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if (strcmp(mysteryWord,hiddenWord) == 0)

    Je n'ai pas ce problème dans le test :/
    Nom : C3.PNG
Affichages : 250
Taille : 3,1 Ko

    J'ai regardé si c'était lié au WordHider, mais les tests étaient concluant :/
    Nom : C4.PNG
Affichages : 241
Taille : 4,7 Ko

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Où mets-tu le caractère de fin de chaîne dans ton char* ? Parce que perso je le vois nulle part.
    A partir de là, qu'il se passe n'importe quoi est un moindre mal.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Membre confirmé Avatar de Redgard
    Homme Profil pro
    x
    Inscrit en
    Décembre 2014
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : x

    Informations forums :
    Inscription : Décembre 2014
    Messages : 90
    Par défaut
    J'y avais pas pensé, ça viendra avec le temps

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void WordHider(char mysteryWord[], char hiddenWord[])
    {
    	int i;
     
    	for (i = 0; mysteryWord[i] != '\0'; i++)
    	{
    		hiddenWord[i] = '*';
    	}
     
    	hiddenWord[i] = '\0';
    }
    Nom : C1.PNG
Affichages : 243
Taille : 14,5 Ko

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

Discussions similaires

  1. Réponses: 18
    Dernier message: 02/03/2012, 15h52
  2. Réponses: 8
    Dernier message: 24/08/2007, 11h18
  3. Réponses: 4
    Dernier message: 08/01/2006, 18h26
  4. [Kylix] Installation réussie mais problème
    Par duviau dans le forum EDI
    Réponses: 2
    Dernier message: 27/05/2005, 16h54
  5. OPENROWSET avec l'analyseur: OK mais plantage sous 'DOS'
    Par Labienus dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/06/2004, 15h47

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