Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1653 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Definir un type booléen en C

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Definir un type booléen en C

n°619585
captainneu​neu
Posté le 23-01-2004 à 00:24:06  profilanswer
 

salut,
ya un truc qui est pas clair pour moi : le booléen n'existe pas en C, a la base, mais a été introduit dans le C99, c bien ca ?
si je veux ecrire un programme le plus portable possible et le plus "collé" a la norme, est-ce que j'ai le droit d'utiliser le C99 ? sinon, une fois que j'ai défini ca :
 
FALSE 1==0
TRUE !FALSE
 
comment je fais pour créer mon propre type BOOL a partir de mes valeurs FALSE et TRUE ?
 
merci de votre aide ;)
++

mood
Publicité
Posté le 23-01-2004 à 00:24:06  profilanswer
 

n°619590
Kristoph
Posté le 23-01-2004 à 00:32:00  profilanswer
 

Le C99 est la norme la plus récente du C. Si tu veux coller à la norme, tu utilises le type bool qui y est défini tout simplement.

n°619594
captainneu​neu
Posté le 23-01-2004 à 00:37:09  profilanswer
 

Kristoph a écrit :

Le C99 est la norme la plus récente du C. Si tu veux coller à la norme, tu utilises le type bool qui y est défini tout simplement.


 
ok, je v faire comme ca alors
merci ;)

n°619596
Taz
bisounours-codeur
Posté le 23-01-2004 à 00:37:56  profilanswer
 

moi je mettrais FALSE à 0
 
sinon tu l'enum qui marche aussi.
 
effectivement C99 est bien pour ça.

n°619621
Taz
bisounours-codeur
Posté le 23-01-2004 à 01:13:07  profilanswer
 

enfin ceci ne fait que définier les valeurs pas le type
 
alors au choix, int ou char

n°619660
matafan
Posté le 23-01-2004 à 03:37:29  profilanswer
 

Moi je ferais un truc comme ça :

Code :
  1. typedef enum {
  2.         TRUE  = (1==1),
  3.         FALSE = (1==0),
  4. } bool_t;

n°619712
captainneu​neu
Posté le 23-01-2004 à 09:36:32  profilanswer
 

matafan a écrit :

Moi je ferais un truc comme ça :

Code :
  1. typedef enum {
  2.         TRUE  = (1==1),
  3.         FALSE = (1==0),
  4. } bool_t;




 
!!
c'est exactement ce que je voulais savoir!
j'avais jamais entendu parler de enum en cours!
ca a l'air bien pratique
 
sinon, taz, kes ke tu veux dire quand tu dis d'utiliser int ou char ? t'as un petit morceau de code concret pour que je vois a quoi ca correspond ?

n°619728
chrisbk
-
Posté le 23-01-2004 à 09:51:36  profilanswer
 

matafan a écrit :

Moi je ferais un truc comme ça :

Code :
  1. typedef enum {
  2.         TRUE  = (1==1),
  3.         FALSE = (1==0),
  4. } bool_t;




 
[:xx_xx]

n°619736
El_gringo
Posté le 23-01-2004 à 09:55:13  profilanswer
 


 
Ouais. J'hallucinais un peu aussi !


---------------
Les Vers Solitaires, on aime ... ou pas !
n°619768
captainneu​neu
Posté le 23-01-2004 à 10:16:46  profilanswer
 

el_gringo a écrit :


 
Ouais. J'hallucinais un peu aussi !


 
ah
 
spa bon ?

mood
Publicité
Posté le 23-01-2004 à 10:16:46  profilanswer
 

n°619775
chrisbk
-
Posté le 23-01-2004 à 10:19:24  profilanswer
 

captainneuneu a écrit :


 
ah
 
spa bon ?


 
c'est assez grotesque, enfin, je trouve.  
En C une condition est vraie si elle est != de 0, alors autant mettre 1 direct sans se casser la tete

n°619820
El_gringo
Posté le 23-01-2004 à 10:35:19  profilanswer
 

chrisbk a écrit :


c'est assez grotesque, enfin, je trouve.  
En C une condition est vraie si elle est != de 0, alors autant mettre 1 direct sans se casser la tete


 
Ben oui...


---------------
Les Vers Solitaires, on aime ... ou pas !
n°620791
matafan
Posté le 24-01-2004 à 02:09:21  profilanswer
 

Grotesque pas forcément... C'est fait exprès pour ne pas mélanger des concepts « logiques » (vrai, faux) avec des conecpts « numériques » (1, 0). Le résultat brut est strictement le même, évidemment. Mais à priori si tu veux un type booléen c'est que t'as pas envie de mélanger les genres.

n°620794
chrisbk
-
Posté le 24-01-2004 à 02:11:00  profilanswer
 

bah ? ca t'arrives jamais d'ecrire if(!x) ? :D

n°620812
jerry artw​ood
Posté le 24-01-2004 à 10:42:19  profilanswer
 

matafan a écrit :

Grotesque pas forcément... C'est fait exprès pour ne pas mélanger des concepts « logiques » (vrai, faux) avec des conecpts « numériques » (1, 0). Le résultat brut est strictement le même, évidemment. Mais à priori si tu veux un type booléen c'est que t'as pas envie de mélanger les genres.


 
quel histoire de genre ? faux = 0, vrai = tout ce qui est different de 0 en C, donc tu peux faire

Code :
  1. #define TRUE 1
  2. #define FALSE 0


ou si tu tient à ton enum

Code :
  1. typedef enum {       
  2.        FALSE,
  3.        TRUE
  4. } bool_t;


(ben oui dans un enum ça commence toujours par 0,1,...) , et ça sera portable partout pourvu que le compilo soit compatible C ansi

n°620858
blackgodde​ss
vive le troll !
Posté le 24-01-2004 à 14:58:49  profilanswer
 

mais bien sur ...
 
"vrai = tout ce qui est different de 0"
"#define TRUE 1"
 
ya pas contradiction la ?  
par exemple 2 != 0, mais 2 != TRUE aussi ...


Message édité par blackgoddess le 24-01-2004 à 14:59:06
n°620862
Kristoph
Posté le 24-01-2004 à 15:19:44  profilanswer
 

BlackGoddess a écrit :

mais bien sur ...
 
"vrai = tout ce qui est different de 0"
"#define TRUE 1"
 
ya pas contradiction la ?  
par exemple 2 != 0, mais 2 != TRUE aussi ...


 
C'est normal puisque 2 est un entier et TRUE est un booléen. C'est plustot le fait que (0 == FALSE) qui soit douteux.

n°620863
printf
Baston !
Posté le 24-01-2004 à 15:19:50  profilanswer
 

Certains semblent confondre l'algèbre de Boole (deux états logiques possibles : 0 ou 1) et le concept vrai/faux du langage C (où tout ce qui n'est pas nul est vrai).
 
Voici la solution que je propose :
 

Code :
  1. #define FALSE 0
  2. #define TRUE  1
  3. typedef unsigned char booleen;


 
EDIT: méchante faute d'orthographe :ange:


Message édité par printf le 24-01-2004 à 15:27:13

---------------
Un matin je me lèverai et il fera beau.
n°620865
Kristoph
Posté le 24-01-2004 à 15:26:01  profilanswer
 

Au fait, une nouvelle fois je propose tout simplement :
 

Code :
  1. gcc -std=c99


 
:D

n°621277
captainneu​neu
Posté le 25-01-2004 à 14:41:00  profilanswer
 

Kristoph a écrit :

Au fait, une nouvelle fois je propose tout simplement :
 

Code :
  1. gcc -std=c99


 
:D


 
on est d'accord pour le fait qu'utiliseer le c99 soit la meilleure solution, puisque le booleen est prevu
 
sinon, pôurquoi utiliser du booleen et pas un unsigned char avec 0 et 1 ? tout simplement pour ne pas melanger les types, et paske un prog avec des conditions exprimees avec TRUE et FALSE peut paraitre plus facile a comprendre.
 
on aurait donc FALSE equivalent à 0 d'ou
#define FALSE 1==0
 
et un TRUE equivalent a tout sauf 0 d'ou
#define TRUE !FALSE
 
donc apres, on peut appliqué un énum avec ces deux valeurs.
 
merci a tous pour vos idées et surtout pour m'avoir permis de decouvrir l'utilisation de enum dont j'ignorais l'existence jusqu'a maintenant

n°627037
jerry artw​ood
Posté le 31-01-2004 à 17:43:50  profilanswer
 

!(1==0) ça renvoie le resultat 1 et pas n'importe quoi diferent de 0 (et oui c'est une operation arithmetique pour la machine avec un resultat determiné), c'est pour ça que ça sert à rien de faire des enums tordus pour exprimer quelque chose de tout con

n°627051
R3g
fonctionnaire certifié ITIL
Posté le 31-01-2004 à 17:56:23  profilanswer
 

moi un jour j'avais fais ça :

Code :
  1. #define FALSE 0
  2. #define TRUE !0

:D

n°994289
mumuri
Posté le 26-02-2005 à 18:09:24  profilanswer
 

Pour ceux qui cherchent comment faire un booleen en C normal , vous pouvez  
toujours définir un type booleen à partir d'un char
 

Citation :


#define booleen char
#define TRUE 1
#define FALSE 0
 
int main(void)
{
booleen drapeau;
if (drapeau == TRUE)
       printf("vrai\n" );
else
       printf("faux\n" );
 
return 0;
}


 
Vous perdez 7 bits au passage mais c'est toujours moin qu'en VB.
 
EDIT un typedef serait plus propre "typedef char boolean;"
 
PS : dsl d'avoir remonté le message, mais s'il a fait plus de 600 pages vues. C'est qu'il doit y avoir pas mal de gars qui cherche booleen en C sur google
http://www.google.fr/search?hl=fr& [...] en+c&meta=


Message édité par mumuri le 26-02-2005 à 18:13:07

---------------
Top flood - Web'netters - bookona - Game'shots - Anime'shots
n°994303
Sve@r
Posté le 26-02-2005 à 18:34:02  profilanswer
 

printf a écrit :

Certains semblent confondre l'algèbre de Boole (deux états logiques possibles : 0 ou 1) et le concept vrai/faux du langage C (où tout ce qui n'est pas nul est vrai).
 
Voici la solution que je propose :
 

Code :
  1. #define FALSE 0
  2. #define TRUE  1
  3. typedef unsigned char booleen;


 
EDIT: méchante faute d'orthographe :ange:


 
Est-ce que cette solution est vraiment sans danger ?
Imaginons que je veuille vérifier que "qqchose" s'est bien passé et que j'écrive

Code :
  1. if (qqchose(...) == TRUE)


Ben si "qqchose" renvoie "2", selon le concept du C c'est "vrai" mais mon "if", lui, sera considéré comme faux !!!
 
Donc finallement la macro "TRUE" ne sert à rien. Et je dois, pour être vraiment correct, écrire

Code :
  1. if (qqchose(...) != FALSE)



Message édité par Sve@r le 26-02-2005 à 18:35:53
n°994316
Taz
bisounours-codeur
Posté le 26-02-2005 à 18:56:03  profilanswer
 

note qu'en C99, c'est un vrai type booléen.
 

Code :
  1. #include <stdio.h>
  2. #ifdef HFR
  3. #include <stdbool.h>
  4. #else
  5. #define bool int
  6. #endif
  7. int main()
  8. {
  9.         bool b = (bool)0.1;
  10.         if(b)
  11.                 puts("true" );
  12.         else
  13.                 puts("false" );
  14.         return 0;
  15. }


 
Donc attention.

n°994359
Elghinn42
Posté le 26-02-2005 à 19:47:21  profilanswer
 

Sve@r a écrit :

Est-ce que cette solution est vraiment sans danger ?
Imaginons que je veuille vérifier que "qqchose" s'est bien passé et que j'écrive

Code :
  1. if (qqchose(...) == TRUE)


Ben si "qqchose" renvoie "2", selon le concept du C c'est "vrai" mais mon "if", lui, sera considéré comme faux !!!
 
Donc finallement la macro "TRUE" ne sert à rien. Et je dois, pour être vraiment correct, écrire

Code :
  1. if (qqchose(...) != FALSE)



C'est totalement stupide de faire: if (qqchose(...) == TRUE)
if (qqchose(...)) suffit largement


---------------
"le logiciel libre est une question de liberté, pas de prix" - Richard M. Stallman - (http://www.gnu.org/philosophy/why-free.fr.html)
n°994374
Emmanuel D​elahaye
C is a sharp tool
Posté le 26-02-2005 à 20:25:11  profilanswer
 

captainneuneu a écrit :

ya un truc qui est pas clair pour moi : le booléen n'existe pas en C,


Exact, et l'expérience montre que ça ne sert à rien à part user le clavier. Il est beaucoup plus utile de bien nommer ses 'flags', c'est à dire ni 'f', ni 'flag', ni 'toto'!


 
/* 0 = ok  
 * 1 = error  
 */
int err;  
 
/* 0 = not found  
 * 1 = found  
 */
int found;  


etc. Le commentaire est en fait inutile, car le nom doit être autodocumentant (adjectif ou condition quand la valeur est 1)

Citation :


 a la base, mais a été introduit dans le C99, c bien ca ?


Oui, on se demande pourquoi...  
<speculation=1>
Sous la pression des neuneus de Microsoft, probablement...
<speculation=0>

Citation :


si je veux ecrire un programme le plus portable possible et le plus "collé" a la norme, est-ce que j'ai le droit d'utiliser le C99 ? sinon, une fois que j'ai défini ca :
 
FALSE 1==0
TRUE !FALSE
 
comment je fais pour créer mon propre type BOOL a partir de mes valeurs FALSE et TRUE ?


Si tu y tiens...  
Ne pas utiliser les macros dont tu as parlé avant, mais plutôt :

typedef enum {FALSE, TRUE} BOOL;


mais encore une fois, ça ne sert à rien. En C, une expression retourne 0 ou 1, pas false / true...
 
Si j'ecris  

if (!err)

c'est plus clair et plus simple que

if (err == FALSE)


non ?


Message édité par Emmanuel Delahaye le 26-02-2005 à 20:38:32

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°994377
Sve@r
Posté le 26-02-2005 à 20:29:06  profilanswer
 

Elghinn42 a écrit :

C'est totalement stupide de faire: if (qqchose(...) == TRUE)
if (qqchose(...)) suffit largement


 
C'est exactement ce que je dis (de façon moins brutale) en disant que la macro "TRUE" ne sert à rien...
 
[edited]
Rectification... en fait, cela peut servir si on est totalement maître du codage de la fonction "qqchose". Mais si on le veut, on peut quand-même se passer de "TRUE" et "FALSE".[/edited]


Message édité par Sve@r le 26-02-2005 à 20:38:43
n°994384
Sve@r
Posté le 26-02-2005 à 20:42:45  profilanswer
 

Emmanuel Delahaye a écrit :

Si j'ecris  

if (!err)

c'est plus clair et plus simple que

if (err == FALSE)


non ?


 
Personnellement je préfère écrire et lire

if (qqchose(...) == 0)


que la syntaxe

if (!qqchose(...))


mais c'est une question de préférence personnelle.
 


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°995642
db__
spécialiste de l'à peu près
Posté le 28-02-2005 à 12:47:36  profilanswer
 

Bonjour
Si le type binaire n'existait pas en C, c'est qu'il ne servait à rien et son introduction n'aporte qu'une lisibilité encore plus réduite du code.
Il est possible de réduire l'encombrement de ces indicateurs binaires en les regroupant dans un unsigned et d'utiliser les opérateurs & | ^ et l'hexadécimal pour les positionner, les tester et les inverser. C'est efficace mais pas moderne !

n°995661
Taz
bisounours-codeur
Posté le 28-02-2005 à 13:09:22  profilanswer
 

à toi de nous dire comme stocker atomiquement et efficacement 1 seul bit ...

n°995663
coffeeman
Posté le 28-02-2005 à 13:11:53  profilanswer
 

db__ a écrit :


Si le type binaire n'existait pas en C, c'est qu'il ne servait à rien et son introduction n'aporte qu'une lisibilité encore plus réduite du code.


 
J'ai ri :sweat:


---------------
Moi, j'aime pas les signatures - J'écoute actuellement :
n°995862
Emmanuel D​elahaye
C is a sharp tool
Posté le 28-02-2005 à 15:05:43  profilanswer
 

Taz a écrit :

à toi de nous dire comme stocker atomiquement et efficacement 1 seul bit ...


Personnellement, j'utilise les champs de bits dans des structures internes.


struct buffer
{
   void *buf;
   size_t size;
   unsigned dyn:1;
};


évidemment, ca va occuper un int. Mais si il faut un deuxième flag:


struct buffer
{
   void *buf;
   size_t size;
   unsigned dyn:1;
   unsigned monflag:1;
};


ça n'occupera toujours qu'un int au lieu de 2...
 
Dans certains gros tableaux de structures, ça permet de bien optimiser la taille (au détriment d'un temps d'accès un peu plus long, évidemment...)


Message édité par Emmanuel Delahaye le 28-02-2005 à 15:07:52

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°995887
Taz
bisounours-codeur
Posté le 28-02-2005 à 15:24:52  profilanswer
 

Emmanuel Delahaye a écrit :

Personnellement, j'utilise les champs de bits dans des structures internes.

voilà, on est bien d'accord : ce n'est pas un type :)
Moi aussi je me gave de champs de bits. Ça m'a permis dernièrement d'économiser 24octets sur une structure x 2500 instances ça m'a bien aidé :)
 

n°995896
Emmanuel D​elahaye
C is a sharp tool
Posté le 28-02-2005 à 15:30:33  profilanswer
 

Taz a écrit :

voilà, on est bien d'accord : ce n'est pas un type :)
Moi aussi je me gave de champs de bits. Ça m'a permis dernièrement d'économiser 24octets sur une structure x 2500 instances ça m'a bien aidé :)


Exactement, surtout en embarqué.
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Definir un type booléen en C

 

Sujets relatifs
type de caractère en cpb d'emploie du type HDC sous VC++6.0
[ADA]Définir un sous-type avec des bornes spéciales[VBA][Excel]definir la selection dans une macro [resolu]
Comment tester l appartenance d une variable a un type ??[VB] petit defi : récuperer le nom d'une variable dans un TYPE
Trouver toutes les instances d'un type de class connu[VBA] Définir la couleur d'une cellule à aucun remplissage RESOLU
VBA; parcourir dynamiqument un type..end type 
Plus de sujets relatifs à : Definir un type booléen en C


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR