Definir un type booléen en C - C - Programmation
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.
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
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.
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
Marsh Posté le 23-01-2004 à 03:37:29
Moi je ferais un truc comme ça :
Code :
|
Marsh Posté le 23-01-2004 à 09:36:32
matafan a écrit : Moi je ferais un truc comme ça :
|
!!
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 ?
Marsh Posté le 23-01-2004 à 09:51:36
matafan a écrit : Moi je ferais un truc comme ça :
|
Marsh Posté le 23-01-2004 à 09:55:13
ReplyMarsh Posté le 23-01-2004 à 10:16:46
ReplyMarsh Posté le 23-01-2004 à 10:19:24
captainneuneu 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
Marsh Posté le 23-01-2004 à 10:35:19
chrisbk a écrit : |
Ben oui...
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.
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 :
|
ou si tu tient à ton enum
Code :
|
(ben oui dans un enum ça commence toujours par 0,1,...) , et ça sera portable partout pourvu que le compilo soit compatible C ansi
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 ...
Marsh Posté le 24-01-2004 à 15:19:44
BlackGoddess a écrit : mais bien sur ... |
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.
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 :
|
EDIT: méchante faute d'orthographe
Marsh Posté le 24-01-2004 à 15:26:01
Au fait, une nouvelle fois je propose tout simplement :
Code :
|
Marsh Posté le 25-01-2004 à 14:41:00
Kristoph a écrit : Au fait, une nouvelle fois je propose tout simplement :
|
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
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
Marsh Posté le 31-01-2004 à 17:56:23
moi un jour j'avais fais ça :
Code :
|
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 : |
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=
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).
|
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 :
|
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 :
|
Marsh Posté le 26-02-2005 à 18:56:03
note qu'en C99, c'est un vrai type booléen.
Code :
|
Donc attention.
Marsh Posté le 26-02-2005 à 19:47:21
Sve@r a écrit : Est-ce que cette solution est vraiment sans danger ?
|
C'est totalement stupide de faire: if (qqchose(...) == TRUE)
if (qqchose(...)) suffit largement
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'!
|
etc. Le commentaire est en fait inutile, car le nom doit être autodocumentant (adjectif ou condition quand la valeur est 1)
Citation : |
Oui, on se demande pourquoi...
<speculation=1>
Sous la pression des neuneus de Microsoft, probablement...
<speculation=0>
Citation : |
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 ?
Marsh Posté le 26-02-2005 à 20:29:06
Elghinn42 a écrit : C'est totalement stupide de faire: if (qqchose(...) == TRUE) |
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]
Marsh Posté le 26-02-2005 à 20:42:45
Emmanuel Delahaye a écrit : Si j'ecris
c'est plus clair et plus simple que
|
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.
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 !
Marsh Posté le 28-02-2005 à 13:09:22
à toi de nous dire comme stocker atomiquement et efficacement 1 seul bit ...
Marsh Posté le 28-02-2005 à 13:11:53
db__ a écrit : |
J'ai ri
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.
|
évidemment, ca va occuper un int. Mais si il faut un deuxième flag:
|
ç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...)
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é
Marsh Posté le 28-02-2005 à 15:30:33
Taz a écrit : voilà, on est bien d'accord : ce n'est pas un type |
Exactement, surtout en embarqué.
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
++