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 :

Problème caractère (char) VISUAL STUDIO


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2015
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2015
    Messages : 224
    Par défaut Problème caractère (char) VISUAL STUDIO
    Bonjour,

    Étant novice en C, j'ai tenté de traduire un algorithme que je possédais en pseudo-langage. Il a l'air de très bien se compiler, mais un problème surgit au moment où l'algorithme lit une variable "char". Un message d'erreur de ce type apparait "Run-Time Check Failure #3 - The variable 'degonfle' is being used without being initialized." Mais pourtant il me semble bien avoir initialisé la variable "degonfle"...
    Voici le code :

    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
     
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main()
    {
    	int NbTabou, Des1, Des2, score;
    	char degonfle;
     
    	/* Début */
     
    	do
    	{
    		printf("Saisir nombre tabou : ");
    		scanf_s("%d", &NbTabou);
    		printf("\n"); /* retour à la ligne */
    		if (NbTabou < 2 || NbTabou>12)
    		{
    			printf("Erreur de saisie, veuillez recommencer S.V.P \n");
    		}
     
    	}
    	while (NbTabou < 2 || NbTabou>12);
     
    	do
    	{
    		do
    		{
    			printf("Saisir des 1 : ");
    			scanf_s("%d", &Des1);
    			printf("\n"); /* retour à la ligne */
    			if (Des1 < 1 || Des1>6)
    			{
    				printf("Erreur de saisie sur le des 1, veuillez recommencer S.V.P \n");
    			}
    			else
    			{
    				printf("Bonne saisie du des 1 \n");
     
    			}
     
    		} while (Des1 < 1 || Des1>6);
     
    		score = 0;
     
    		do
    		{
    			printf("Saisir des 2 : ");
    			scanf_s("%d", &Des2);
    			printf("\n"); /* retour à la ligne */
    			if (Des2 < 1 || Des2>6)
    			{
    				printf("Erreur de saisie sur le des 2, veuillez recommencer S.V.P \n");
    			}
    			else
    			{
    				printf("Bonne saisie du des 2 \n");
     
    			}
     
    		} while (Des2 < 1 || Des2>6);
     
    		printf("Ton tirage est : Des 1 = %d et Des 2 = %d ", Des1, Des2);
     
    		if (Des1 + Des2 != NbTabou)
    		{
    			score = score + Des1 + Des2;
    			printf("Score = %d", score);
    			printf("\n"); /* retour à la ligne */
    			do
    			{
    				printf("Tu te degonfles ? o pour OUI, n pour NON ! \n");
    				scanf_s("%c", degonfle); fflush(stdin);
    				if ((degonfle != 'o') || (degonfle != 'n'))
    				{
    					printf("Erreur de saisie sur le degonfle. Rappel : o pour OUI, n pour NON !!! ");
    				}
    			} 
    			while ((degonfle != 'o') || (degonfle != 'n'));
    				if (degonfle == 'o')
    				{
    					printf("T'as vraiment pas de sang dans les veines \n");
    					printf("Score = %d", score);
    				}
    		}
    		else
    		{
    			printf("Tu fais moins le malin maintenant ! \n");
    		}
    	} 
    	while ((Des1 + Des2 != NbTabou) && degonfle == 'n');
     
     
    	system("pause");
     
    }
    Je vous précise ma façon de créer un projet dans VISUAL STUDIO (j'ai suivi la procédure de notre prof) :
    -Fichier-Nouveau Projet
    -Visual C++ - Win32 - Application console win32 - OK
    - Type d'applicatio, : application console - Option supplémentaire : Projet vide, en tête précompilé - Terminer
    - A droite : Fichier source, clic droit - Nouvel élément - Code - Fichier C++ - Ajouter
    -Projet - Propriété de... - Propriété de configuration - C/C++ - Avancé - Compilation sous : Compiler comme code C (/TC) - OK

    Voilà. Alors soit c'est une erreur de débutant dans mon programme et je m'en excuse, mais je ne la vois pas ( ah oui, l'erreur est indicée à la ligne 73), soit c'est un défaut de paramétrage de mon VISUAL STUDIO, ce qui est possible, car j'avais fait sur les PC de la fac un petit programme qui me donnait l'équivalent majuscule d'une lettre minuscule que je rentrais. Or il marchait là-bas, et chez moi, il me sort pas le bon résultat.
    De plus, ce qui me tracasse un peu, c'est qu'à droite (dans l'explorateur de solution), il y a une arborescence, et mon programme est en .cpp, mais je ne me souviens pas si sur le logiciel de la fac c'était pareil.

    Merci d'avance pour votre aide !

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    scanf_s peut ne pas initialiser la variable, si la saisie se passe mal.
    Par ailleurs, il y a un cas où le controle de la boucle principale (la plus extérieure) peut vérifier degonfle sans qu'elle ait été initialisée:
    Si le premier tirage est le nombre tabou (ce qui est probable si celui ci est 7).

    initialise degonfle à 'n' quand tu le déclare.

    Mieux initialise le à code_reponse_non, qui serait un char const défini à 'n'.

  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
    fflush(stdin) : ça c'est vraiment très mauvais pour ton programme, retires-le.

  4. #4
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 771
    Par défaut
    RTFM Nom : rtfm2.gif
Affichages : 180
Taille : 701 octets scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l

    Citation:
    In the case of characters, a single character may be read as follows:

    char c;

    scanf_s("%c", &c, 1);

  5. #5
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2015
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2015
    Messages : 224
    Par défaut
    Je ne suis pas sûr d'avoir compris. Il faut qu'à la place de : je mette :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char const code_reponse_non='n';
    ?

    Concernant le fflush(stdin), j'avais essayé sans, mais ça ne marchait pas non plus. A vrai dire, je ne sais pas à quoi ça sert, j'ai trouvé ça dans le cours qu'on n'a pas encore vu... Donc je vais l'enlever.

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Concernant la constante, j'écrirai:

    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
     
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main() {
    	/*ou en variable globale, mais autant que possible, il vaut mieux s'en passer */
    	char const code_reponse_non = 'n';
    	char const code_reponse_oui = 'o';
     
    	int NbTabou, Des1, Des2, score;
    	char degonfle = code_reponse_non;
     
    	/* Début */
     
    	do
    	{
    		printf("Saisir nombre tabou : ");
    		scanf_s("%d", &NbTabou);
    		printf("\n"); /* retour à la ligne */
    		if (NbTabou < 2 || NbTabou>12)
    		{
    			printf("Erreur de saisie, veuillez recommencer S.V.P \n");
    		}
     
    	}
    	while (NbTabou < 2 || NbTabou>12);
     
    	do
    	{
    		 /* saisie des dés ... */
     
    		if (Des1 + Des2 != NbTabou)
    		{
    			score = score + Des1 + Des2;
    			printf("Score = %d", score);
    			printf("\n"); /* retour à la ligne */
    			do
    			{
    				printf("Tu te degonfles ? %c pour OUI, %c pour NON. \n", code_reponse_oui, code_reponse_non);
    				scanf_s("%c", degonfle); fflush(stdin);
    				if ((degonfle != code_reponse_oui) || (degonfle != code_reponse_non))
    				{
    					printf("Erreur de saisie sur le degonfle. Rappel : %c pour OUI, %c pour NON !\n", code_reponse_oui, code_reponse_non");
    				}
    			} 
    			while ((degonfle != code_reponse_oui) || (degonfle !=code_reponse_non));
    				if (degonfle == code_reponse_oui)
    				{
    					printf("T'as vraiment pas de sang dans les veines \n");
    					printf("Score = %d", score);
    				}
    		}
    		else
    		{
    			printf("Tu fais moins le malin maintenant ! \n");
    		}
    	} 
    	while ((Des1 + Des2 != NbTabou) && degonfle == code_reponse_non);
     
     
    	system("pause");
     
    }
    En procédant ainsi, je n'ai plus de 'o' ou de 'n' qui traine partout.
    Seulement des éléments nommés.
    Il n'y a pas de magie pour la relecture du code.

    Par ailleurs, choisis si tes variables sont avec ou sans majuscules, et fait partout pareil: Des1 et degonfleDans le meme genre, c'est du détail pour le compilateur, mais pas pour celui qui lit le code, un dé, au singulier, ca n'a pas de s. donc, tes variables, ca devrait être de1 et de2 (pour devenirs des[2])

  7. #7
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Non, leternel te conseille d'initialiser ta variable avec cette constante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char const code_reponse_non = 'n';
    char degonfle = code_reponse_non;
    Ainsi, elle contient toujours une valeur valide même si la saisie a échoué.


    Citation Envoyé par Stéphanois57 Voir le message
    Concernant le fflush(stdin), j'avais essayé sans, mais ça ne marchait pas non plus. A vrai dire, je ne sais pas à quoi ça sert, j'ai trouvé ça dans le cours qu'on n'a pas encore vu... Donc je vais l'enlever.
    Rasoir d'Occam : n'écris jamais d'instruction dont tu ne connais pas le rôle.

  8. #8
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2015
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2015
    Messages : 224
    Par défaut
    J'ai trouvé le gros de l'erreur... il manque le & commercial devant degonfle.... Je l'avais dit, erreur de débutant. Pourtant j'avais relu plusieurs fois le code, et ça ne me sautait pas aux yeux...
    C'est pas pour autant que le programme fait ce que je veux... Je vais un peu chercher, je reviendrai vers vous si ça ne va pas mieux.

    Merci déjà pour l'aide !

  9. #9
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Tu l'aurais vu plus vite si tu avais activé plus de warning

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

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