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 :

définir boolean en préprocessor


Sujet :

C

  1. #1
    Membre du Club 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
    Points : 60
    Points
    60
    Par défaut définir boolean en préprocessor
    Bonjour,


    je suis en train de regarder ça > http://www.cplusplus.com/doc/tutorial/preprocessor/

    Dans le but de définir un boolean dans les instructions du préprocesseur.

    J'ai fait une tentative, l'objectif étant de définir boolean, si il n'est pas encore définit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifndef bool					// si non définit, définit boolean
    #define bool					// est-ce que je devrais pas indiquer un "int" quelques parts?
    #define TRUE 1
    #define FALSE 0
    #endif							// !boolean
    Mais cette tentative n'a pas trop l'air de marcher, ayant de message d'erreur comme quoi mes variables ne sont pas définies à la compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    MysteryBox.c(31): error C2065: 'continuerPartie'*: identificateur non déclaré
    MysteryBox.c(56): warning C4028: paramètre formel 1 différent de la déclaration
    MysteryBox.c(56): warning C4028: paramètre formel 2 différent de la déclaration
    MysteryBox.c(56): error C2146: erreur de syntaxe*: absence de ';' avant l'identificateur 'GameMstBx'
    MysteryBox.c(59): error C2065: 'continuerPartie'*: identificateur non déclaré
    MysteryBox.c(133): warning C4028: paramètre formel 1 différent de la déclaration
    MysteryBox.c(133): warning C4028: paramètre formel 2 différent de la déclaration
    MysteryBox.c(264): error C2065: 'statusG'*: identificateur non déclaré
    MysteryBox.c(270): error C2065: 'statusG'*: identificateur non déclaré
    MysteryBox.c(274): error C2065: 'statusG'*: identificateur non déclaré
    MysteryBox.c(278): error C2065: 'statusG'*: identificateur non déclaré
    MysteryBox.c(282): error C2065: 'statusG'*: identificateur non déclaré
    Code complet:
    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
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    #ifndef bool					// si non définit, définit boolean
    #define bool					// est-ce que je devrais pas indiquer un "int" quelques parts?
    #define TRUE 1
    #define FALSE 0
    #endif							// !boolean
     
    //déclaration des fonctions secondaires
    void CopFichier(FILE *fileBuffer);
    int DispTitle(void);
     
    int MenuLvl(void);
    void ChooseLvl(int *MIN, int *MAX);
     
    int YourNumb(const int MIN, const int MAX);
    int TestNumb(int myNumb, const int nbrMystere);
    void ScoreTab(const int nbrMystere, int compteur);
    void GameMstBx(const int MIN, const int MAX);
     
    int MenuRestart(void);
    bool RestartGame(void);
     
    void PauseApp(void);
     
    // ==================== FONCTION MAIN ====================
    int main() {
    	int status = 0;
    	bool continuerPartie = FALSE;
     
    	//declaration des constantes
    	int MIN, MAX;
     
    	int *pMIN, *pMAX;
    	pMIN = &MIN;
    	pMAX = &MAX;
     
    	//initialisation du générateur de nombre aléatoire
    	srand(time(NULL));
     
    	// affichage du titre du jeux
    	status = DispTitle();
     
    	//stop le programme en cas d'erreur
    	if (status == 1) return 1;
     
    	//Boucle de partie
    	do
    	{
    		//choix du niveau de jeux
    		void ChooseLvl(int pMIN, int pMAX)
     
    		//début de la partie
    		GameMstBx(MIN, MAX);
     
    		//recommencer une partie
    	} while ((continuerPartie = RestartGame()) == TRUE);
     
    	// Pause avant la fin du programme
    	PauseApp();
     
    	//fin du programme
    	return 0;
     
    }
     
    // ==================== FONCTION SECOND ====================
    // imprime écran le contenu du buffer
    void CopFichier(FILE *fileBuffer) {
    	// déclaration des variable
    	char copyStr[257 + 1];
     
    	//impression du contenu du document
    	while (fgets(copyStr, sizeof(copyStr), fileBuffer) != NULL)
    		printf("%s", copyStr);
    }
     
    // fonction affichant le titre:
    int DispTitle(void) {
    	// déclaration des pointeurs
    	char *filename = "./title.txt";
    	FILE *fileBuffer;
     
    	// ouverture vérification du flux
    	if ((fileBuffer = fopen(filename, "r")) == NULL) {
    		fprintf(stderr, "Erreur - Echec de l'ouverture du fichier %s en mode lecture!", filename);
    		// retour valeur sentinelle - une erreur s'est produite
    		return 1;
    	}
     
    	//Impression écran du message
    	fputs("Bienvenu dans \n",stdout);
    	CopFichier(fileBuffer);
    	fputs("\n\n", stdout);
     
    	// fermeture du flux
    	fclose(fileBuffer);
     
    	// retour valeur sentinelle - tout c'est bien passé
    	return 0;
    }
     
    //fonction affichant le menu
    int MenuLvl(void) {
    	//initialisation des variables
    	char entreeCl[10 + 1];
    	int choixLvl = 1, status;
     
    	fputs("Choississez le niveau de votre partie: \n", stdout);
    	fputs("1. Facile\n", stdout);
    	fputs("2. Moyen\n", stdout);
    	fputs("3. Difficile\n", stdout);
     
    	while (1)
    	{
    		fputs("Votre choix : ", stdout);
    		fgets(entreeCl, 10 + 1, stdin);
    		status = sscanf(entreeCl, "%d", &choixLvl);
     
    		// "if" casse la boucle, si les conditions sont remplies
    		if (status == 1 && choixLvl >= 1 && choixLvl <= 3) break;
     
    		// message d'erreur s'affichant si la boucle "if" n'est pas activé
    		fputs("Entree incorrect - Entrez le choix 1, 2 ou 3.\n", stdout);
    	}
     
    	return choixLvl;
    }
     
    //fonction menu permettant de choisir son niveau
    void ChooseLvl(int *pMIN, int *pMAX) {
     
    	switch (MenuLvl())
    	{
    	case 1:
    		printf("Vous avez choisi le niveau de difficulté : Facile");
    		*pMIN = 1;
    		*pMAX = 10;
    		break;
    	case 2:
    		printf("Vous avez choisi le niveau de difficulté : Moyen");
    		*pMIN = 1;
    		*pMAX = 100;
    		break;
    	case 3:
    		printf("Vous avez choisi le niveau de difficulté : Difficile");
    		*pMIN = 1;
    		*pMAX = 1000;
    		break;
    	default:
    		printf("Vous avez choisi le niveau de difficulté : Facile");
    		*pMIN = 1;
    		*pMAX = 10;
    		break;
    	}
    }
     
    // fonction demandant la réponse
    int YourNumb(const int MIN, const int MAX) {
    	char retourCl[10 + 1];
    	int myNumb, status;
     
    	while (1)
    	{
    		printf("Entrez un nombre entre %d et %d : ", MIN, MAX);
    		fgets(retourCl, 10 + 1, stdin);
    		status = sscanf(retourCl, "%d", &myNumb);
     
    		// "if" casse la boucle, si ses conditions sont remplies
    		if (status == 1 && myNumb >= MIN && myNumb <= MAX) break;
     
    		// message d'erreur s'affichant si la boucle "if" n'est pas activé
    		fputs("Entree incorrect - Entrez un nombre compris entre 0 et 100!\n", stdout);
    	}
     
    	return myNumb;
    }
     
    //fonction donnant un indice
    int TestNumb(int myNumb, const int nbrMystere) {
    	if (myNumb < nbrMystere)
    	{
    		fputs("C'est plus!\n", stdout);
    		return 0;
    	}
    	else if (myNumb > nbrMystere)
    	{
    		fputs("C'est moins!\n", stdout);
    		return 0;
    	}
    	else
    	{
    		fputs("Bravo! vous avez trouvez le nombre mystere\n", stdout);
    		return 1;
    	}
    }
     
    //fonction affichant le résultat du joueur
    void ScoreTab(const int nbrMystere, int compteur) {
    	fputs("===== RESULTAT DE PARTIE =====\n", stdout);
    	printf("Le nombre mystere etait : %d \n", nbrMystere);
    	printf("Nombre de tour: %d \n", compteur);
    }
     
    //fonction commençant la partie
    void GameMstBx(const int MIN,const int MAX) {
    	// playerAnswer		- variable stockant la réponse du joueur
    	// nbrMystere		- variable stockant le nombre généré aléatoirement
    	int playerAnswer, nbrMystere;
     
    	// gameWin			- variable définissant la condition du jeux (1 = gagné)
    	// compteur			- variable comptant le nombre de tour
    	int gameWin = 0, compteur = 0;
     
    	//attribution d'un nombre généré aléatoirement
    	nbrMystere = (rand() % (MAX - MIN + 1)) + MIN;
     
    	//boucle de partie
    	do
    	{
    		//compte le nombre de tour
    		compteur++;
     
    		//fonction récupérant la réponse du joueur
    		playerAnswer = YourNumb(MIN, MAX);
     
    		//fonction testant la réponse du joueur
    		gameWin = TestNumb(playerAnswer, nbrMystere);		
    	} while (gameWin == 0);
     
    	// fonction affichant les résultats de partie
    	ScoreTab(nbrMystere, compteur);
    }
     
    //fonction affichant le menu pour recommencer une partie
    int MenuRestart(void) {
    	//initialisation des variables
    	char entreeCl[10 + 1];
    	int rePartie = 1, status;
     
    	fputs("Voulez-vous recommencer une partie: \n", stdout);
    	fputs("1. OUI\n", stdout);
    	fputs("2. NON\n", stdout);
     
    	while (1)
    	{
    		fputs("Votre choix : ", stdout);
    		fgets(entreeCl, 10 + 1, stdin);
    		status = sscanf(entreeCl, "%d", &rePartie);
     
    		// "if" casse la boucle, si les conditions sont remplies
    		if (status == 1 && rePartie >= 1 && rePartie <= 2) break;
     
    		// message d'erreur s'affichant si la boucle "if" n'est pas activé
    		fputs("Entree incorrect - Entrez le choix 1 ou 2.\n", stdout);
    	}
     
    	return rePartie;
    }
    // fonction permettant de recommencer la partie
    bool RestartGame(void) {
    	bool statusG;
     
    	switch (MenuRestart())
    	{
    	case 1:
    		fputs("Début d'une nouvelle partie!\n", stdout);
    		statusG = TRUE;
    		break;
    	case 2:
    		fputs("Au revoir!\n", stdout);
    		statusG = FALSE;
    		break;
    	default:
    		fputs("Au revoir!\n", stdout);
    		statusG = FALSE;
    		break;
    	}
     
    	return statusG;
    }
     
    // fonction de pause du programme - demande une validation pour continuer
    void PauseApp(void) {
    	do {
    		fputs("Appuyez sur 'Entree' pour terminer le programme. \n", stdout);
    	} while (getchar() != '\n');
     
    }

    J'ai aussi un peu regardé sur le net, ce qui s'en dit: https://stackoverflow.com/questions/...an-values-in-c
    > Il n'y a pas d'autre méthode que la 1,2 et 3, pour le définir en instruction du préprocesseur?
    > pour l'option 4 (stdbool.h), à part le fait que le compilateur doit être compatible, y a-t-il d'autres incidence?


    Merci d'avance pour votre aide,
    Red'

  2. #2
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 718
    Points : 2 379
    Points
    2 379
    Par défaut
    Bonjour.

    Avec un simple #define bool tu définis une constante sans valeur, mais pour créer un alias, il te manque effectivement le int après (#define bool int)

    Tu peux définir ton propre type, mais le plus propre est d'utiliser le header stdbool.h que tu as mentionné. Il existe depuis C99 et a donc quasiment 20 ans. À moins de tomber sur un compilateur vraiment ancien tu ne devrais pas avoir de souci à l'utiliser.

    Le type booléen n'existait pas à la création du langage, il a été rajouté plus tard dans ce header, pas en tant que type prédéfini mais en tant qu'alias sur un entier.

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 483
    Points : 13 684
    Points
    13 684
    Billets dans le blog
    1
    Par défaut
    Tu devrais lire cette entrée de la FAQ : https://c.developpez.com/faq/?page=G...e-booleen-en-C

    Et surtout tu devrais faire #include <stdbool.h> et utiliser le type bool fourni comme dit par Daïmanu

  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 735
    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 735
    Points : 31 060
    Points
    31 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Redgard Voir le message
    Mais cette tentative n'a pas trop l'air de marcher, ayant de message d'erreur comme quoi mes variables ne sont pas définies à la compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    MysteryBox.c(31): error C2065: 'continuerPartie'*: identificateur non déclaré
    MysteryBox.c(56): warning C4028: paramètre formel 1 différent de la déclaration
    MysteryBox.c(56): warning C4028: paramètre formel 2 différent de la déclaration
    MysteryBox.c(56): error C2146: erreur de syntaxe*: absence de ';' avant l'identificateur 'GameMstBx'
    MysteryBox.c(59): error C2065: 'continuerPartie'*: identificateur non déclaré
    MysteryBox.c(133): warning C4028: paramètre formel 1 différent de la déclaration
    MysteryBox.c(133): warning C4028: paramètre formel 2 différent de la déclaration
    MysteryBox.c(264): error C2065: 'statusG'*: identificateur non déclaré
    MysteryBox.c(270): error C2065: 'statusG'*: identificateur non déclaré
    MysteryBox.c(274): error C2065: 'statusG'*: identificateur non déclaré
    MysteryBox.c(278): error C2065: 'statusG'*: identificateur non déclaré
    MysteryBox.c(282): error C2065: 'statusG'*: identificateur non déclaré
    Bonjour

    Tu as tenté de créer des variables de type "bool" alors que ce type n'existe pas (en effet, dans ton header, tu n'as pas dit à quoi correspond "bool").

    En fait, je pense que tu as mélangé 2 syntaxes en une seule
    1) la syntaxe qui sert à protéger un header contre une double inclusion
    Exemple header "toto.h"
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #ifndef __TOTO_H_
    #define __TOTO_H_
    #define TOTO_TRUC ...truc...
    #define TOTO_CHOSE ...chose...
    void toto_init();
    void toto_close();
    #enfid //__TOTO_H_

    Les doubles inclusions peuvent être masquées. Par exemple tu inclus "toto.h" parce que tu sais que tu auras besoin de toto_init() ; mais tu inclus aussi "truc.h" sans te douter que "truc.h" inclut lui-aussi "toto.h".
    Donc à la première inclusion, le "__TOTO_H_" n'étant pas défini il est alors défini et la suite du code est traitée, et à la seconde, étant déjà défini tout ce qu'il y a entre le #ifdef et le #endif est ignoré. Sinon, sans cette protection, le compilo ralerait en voyant 2 déclarations de toto_init().

    2) la syntaxe qui sert à créer un nouveau type à partir d'un type existant. Tu aurais pu alors écrire #define bool int mais perso vu qu'il existe typedef je pense que c'est mieux de l'utiliser.

    Et donc tu as mélangé ces deux syntaxes en essayant d'utiliser "bool" à la fois comme type (mais en oubliant de dire de quel type il s'agit) et à la fois comme protection contre la double inclusion.

    Donc, si le header "stdbool.h" n'existait pas, voici comment moi j'aurais écrit cet header (que j'aurais appelé "bool.h")
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef __BOOL_H_
    #define __BOOL_H_
    typedef int bool;
    #define TRUE 1
    #define FALSE 0
    #endif // __BOOL_H_

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 20/09/2005, 18h18
  2. [prg jeux ]Définir l'intersection de deux rectangles
    Par mat.M dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 30/07/2003, 19h11
  3. Définir une appli JEE avec JB7 Entreprise
    Par polo54 dans le forum JBuilder
    Réponses: 4
    Dernier message: 10/06/2003, 12h48
  4. [RAVE] Définir un imprimante...
    Par FW-S dans le forum Rave
    Réponses: 2
    Dernier message: 13/03/2003, 16h15
  5. Comment définir le type matrice ?
    Par charly dans le forum Langage
    Réponses: 7
    Dernier message: 15/06/2002, 22h01

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