Definir un type booléen en C

Definir un type booléen en C - C - Programmation

Marsh Posté le 23-01-2004 à 00:24:06    

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 ;)
++

Reply

Marsh Posté le 23-01-2004 à 00:24:06   

Reply

Marsh Posté le 23-01-2004 à 00:32:00    

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.

Reply

Marsh Posté le 23-01-2004 à 00:37:09    

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 ;)

Reply

Marsh Posté le 23-01-2004 à 00:37:56    

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

Reply

Marsh Posté le 23-01-2004 à 01:13:07    

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

Reply

Marsh Posté le 23-01-2004 à 03:37:29    

Moi je ferais un truc comme ça :

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

Reply

Marsh Posté le 23-01-2004 à 09:36:32    

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 ?

Reply

Marsh Posté le 23-01-2004 à 09:51:36    

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]

Reply

Marsh Posté le 23-01-2004 à 09:55:13    


 
Ouais. J'hallucinais un peu aussi !


---------------
Les Vers Solitaires, on aime ... ou pas !
Reply

Marsh Posté le 23-01-2004 à 10:16:46    

el_gringo a écrit :


 
Ouais. J'hallucinais un peu aussi !


 
ah
 
spa bon ?

Reply

Marsh Posté le 23-01-2004 à 10:16:46   

Reply

Marsh Posté le 23-01-2004 à 10:19:24    

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

Reply

Marsh Posté le 23-01-2004 à 10:35:19    

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 !
Reply

Marsh Posté le 24-01-2004 à 02:09:21    

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.

Reply

Marsh Posté le 24-01-2004 à 02:11:00    

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

Reply

Marsh Posté le 24-01-2004 à 10:42:19    

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

Reply

Marsh Posté le 24-01-2004 à 14:58:49    

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
Reply

Marsh Posté le 24-01-2004 à 15:19:44    

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.

Reply

Marsh Posté le 24-01-2004 à 15:19:50    

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.
Reply

Marsh Posté le 24-01-2004 à 15:26:01    

Au fait, une nouvelle fois je propose tout simplement :
 

Code :
  1. gcc -std=c99


 
:D

Reply

Marsh Posté le 25-01-2004 à 14:41:00    

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

Reply

Marsh Posté le 31-01-2004 à 17:43:50    

!(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

Reply

Marsh Posté le 31-01-2004 à 17:56:23    

moi un jour j'avais fais ça :

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

:D

Reply

Marsh Posté le 26-02-2005 à 18:09:24    

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
Reply

Marsh Posté le 26-02-2005 à 18:34:02    

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
Reply

Marsh Posté le 26-02-2005 à 18:56:03    

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.

Reply

Marsh Posté le 26-02-2005 à 19:47:21    

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)
Reply

Marsh Posté le 26-02-2005 à 20:25:11    

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/
Reply

Marsh Posté le 26-02-2005 à 20:29:06    

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
Reply

Marsh Posté le 26-02-2005 à 20:42:45    

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.
Reply

Marsh Posté le 28-02-2005 à 12:47:36    

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 !

Reply

Marsh Posté le 28-02-2005 à 13:09:22    

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

Reply

Marsh Posté le 28-02-2005 à 13:11:53    

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 :
Reply

Marsh Posté le 28-02-2005 à 15:05:43    

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/
Reply

Marsh Posté le 28-02-2005 à 15:24:52    

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é :)
 

Reply

Marsh Posté le 28-02-2005 à 15:30:33    

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/
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed