Aller au menu - Aller au contenu

Les flags

Pour accéder à cette section
Connectez-vous !
connexion_rpx
Page 1 
Pseudo Commentaire
Page 1 
Hors ligne Anonyme # Posté le 21/03/2007 à 17:11:05

Excellent tuto (un poil trop technique pour moi) !
Je me posais justement la question...
Merci !

17/20
Hors ligne shuss # Posté le 21/03/2007 à 18:20:11
Avatar

Bon tuto ! C'est vrai que j'ai du, dans un premier temps, comprendre les flags par moi-même, et ça n'a pas été facile (mais avec l'SI, j'ai tout pigé).

Je ferais juste une remarque : Code : C++
#define NO_FLAG 0
#define FLAG_A 1
#define FLAG_B 2
#define FLAG_C 4
#define FLAG_D 8

je trouve que d'utiliser des nombres décimaux n'est pas très clair ! Puisqu'on s'arrête à 8, ça va ici, mais si on à 64 (01000000), ou encore 67 pour des flags un peu plus poussé (01000011), les nombres décimaux deviennent incompréhensibles. L'hexadécimal est plus utile pour ça, mais le meilleur, c'est des les écrire directement en binaire (là au moins c'est clair).Code : C++
#define NO_FLAG 0
#define FLAG_A 0b0001
#define FLAG_B 0b0010
#define FLAG_C 0b0100
#define FLAG_D 0b1000


Enfin voilà, c'est plutôt utile comme tuto.
Hors ligne NarTy # Posté le 22/03/2007 à 13:40:27
Je t'aime amèrement !
Avatar
Groupe : Bannis

tuto tres interessant , bravo ! 17

Venez jouer
Mon blog => JuLeS’ ProGs
Programmeur xHTML/CSS,PHP/SQL,Javascript,C à votre service

 
Hors ligne Darkelfe # Posté le 23/03/2007 à 18:30:21
Apprendre tout sur tout
Avatar

Ville : Brignais
Pays : France métropolitaine
Études : IUT A Lyon 1

Tuto très intéressant et insctructif.

18/20

Citation
La négligence du détail détruit l'intelligence de la conception.


Un jeu simple mais addictif ? Minecraft !
 
Hors ligne -ed- # Posté le 26/03/2007 à 09:10:54
C is a sharp tool
Avatar

Études : ECE

Hum, ce code est incorrect...
Citation : tuto flags

Sceptique ? Essayez de compiler ce petit code.
Code : C

#include <stdlib.h>
#include <stdio.h>

int main (int argc, char *argv[])
{
printf("%Id / %Id / %Id", (138|92), (138&92), (138^92));

return 0;
}

Code : Console

Project   : Forums
Compiler  : GNU GCC Compiler (called directly)
Directory : C:\dev\forums2\
--------------------------------------------------------------------------------
Switching to target: default
Compiling: main.c
main.c: In function `main':
main.c:6: warning: unknown conversion type character `I' in format
main.c:6: warning: unknown conversion type character `I' in format
main.c:6: warning: unknown conversion type character `I' in format
main.c:6: warning: too many arguments for format
main.c: At top level:
main.c:4: warning: unused parameter 'argc'
main.c:4: warning: unused parameter 'argv'
Linking console executable: console.exe
Process terminated with status 0 (0 minutes, 0 seconds)
0 errors, 6 warnings

Ceci est correct :
Code : C

#include <stdio.h>

int main (void)
{
   printf ("%d / %d / %d", (138 | 92), (138 & 92), (138 ^ 92));

   return 0;
}
 
Hors ligne Spiky.88 # Posté le 26/03/2007 à 18:21:38
Hello World !
Avatar

Études : Université Versailles Saint Quentin

Il est bien ce tuto, c'est en faite une technique de faire du C++ avec du c.
Hors ligne Pier-Yves Lessard # Posté le 27/03/2007 à 04:07:43
Avatar

Avis : Très bon

Merci pour les commentaires.

J'ai corrigé le code pour éviter les warning que -ed- m'a indiqué. J'ai aussi spécifié qu'il était possible d'utiliser des valeurs binaires et même qu'il était conseillé d'en faire autant si plusieur flags il y a, comme shuss l'a conseillé.
Hors ligne Rafale # Posté le 29/03/2007 à 23:42:44

Bon tuto.
Je met 15 (fallait pas me mettre 13 au QCM na! xD )

Quand on a 13 au QCM :-° (je sais c'st nul mais j'avais pas envie de faire le calcul lol) :
Citation : Pas de titre
Commentaires du professeur : C'est bien, c'est bien. Bon, je vais pas aller jusqu'à dire que c'est excellent, mais "bien" c'est déjà un bon commencement :-p

J'irais pas jusuqu'à dire que commencent est français (mais je me trompe peut etre)
Je mettrais début :-°
Hors ligne brastir # Posté le 18/11/2007 à 11:39:40

Bon tuto je met 17. Mais même commentaire que Rafale! Car 7 points juste pour des calcule de bases c'est un peu dur!
Hors ligne Ptitl0u # Posté le 22/01/2008 à 16:33:37
Avec un 0 comme zéro
Avatar

Bon tuto dans l'ensemble.

Une question, tant que t'y était avec les opérateurs bitaires pourquoi ne pas avoir parlé de l'opérateur de négation ~ ?
Hors ligne Pruneau # Posté le 25/04/2008 à 14:21:41
Holla at me !
Avatar

Pour ma part ce sera 18. Vraiment bien expliqué et bien détaillé !

Merci pour ce tutorial ;)
Hors ligne cube45 # Posté le 16/07/2008 à 17:28:29
Avatar

Ville : Olivet
Pays : France métropolitaine
Études : SUPINFO Région Centre à Orléans

Merci pour ce tutoriel, je me posais la question il y a quelques temps et j'avais galéré pour trouver une réponse claire...

Citation : Alexander Kotov
Un plan correct fait de nous des héros ; l'absence de plan fait de nous des zéros.

 
Hors ligne raphamil # Posté le 02/11/2008 à 23:54:27
Avatar

Études : Université de Bordeaux

Ptitl0u: je plussoie.

Très bon tuto, mais LES #DEFINE CA PUE !!!1oneeleven!

Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#ifndef DEF_FICHIER
#define DEF_FICHIER

enum {
    NO_FLAG,
    FLAG_A,
    FLAG_B = 0x2, //La notation octale
    FLAG_C = 0x4, //marche aussi : 04
    FLAG_D = 0x8,
};
void fonctionTest(unsigned int flags
//En C++, utilise la valeur définie, pas une constante :
#ifdef __cplusplus
= NO_FLAG
#endif
);
#endif

Les langages fonctionnels sont un rien spéciaux, mais ils changent votre manière de voir un programme. Si vous ne connaissez que des dérivés du C (PHP, Python, etc.), changez votre manière de voir ici, et avec OCaml, Haskell, ou Scheme.
 
Hors ligne Dj Kyk # Posté le 26/12/2008 à 00:17:30
J'suis un homme comme moi! ^_^
Avatar

Études : INSA Lyon

Très bon tuto, même si je n'ai lu que la partie "Flags", connaissant déjà les opérateurs bitwise.

Juste une remarque :
Citation : PY
Un unsigned int, étant écrit sur 32 bits, permettra de stocker un minimum de 32 flags. Un unsigned short permetterait d'en stocker un minimum de 16. Un unsigned char, un minimum de 8, etc. À vous de voir quel type vous allez utiliser.

Ce serait pas plutot un maximum?

A shuss et à PY : le préfixe "0b" n'existe pas ni en C ni en C++ à ma connaissance. En tout cas chez moi ça ne marche pas et il me renvoie une erreur.

A Ptitl0u : il est vrai que cet opérateur est rarement cité et c'est dommage. Peut-être n'est-t-il pas très utile? Pour ma part je l'ai déjà utilisé mais bon...

Citation : raphamil
FLAG_B = 0x2, //La notation octale

Non, ceci est la notation hexadécimale. La notation octale est bien :
07 // (7)8
08 // impossible car on passe à 10 après 7 en octal
025 // (25)8
en gros le préfixe est 0.
Citation : Spiky.88
Il est bien ce tuto, c'est en faite une technique de faire du C++ avec du c.

Pourquoi? :o

Sinon à part ça, c'est une bonne astuce ces flags! ^^

Dj Kyk
 
Hors ligne congelli501 # Posté le 03/02/2009 à 22:26:06
Avatar

Ville : La férté-milon
Pays : France métropolitaine
Études : UTC

Bravo, c'était clair et précis !

Mes programmes open sources !

On dit que la Grèce antique beaucoup d'influence sur notre culture... C'est vrai : la chute d'Athènes a eu lieu en 404 avant JC. Ça vous rappelle quelque chose ?
 
Hors ligne rz0 # Posté le 15/08/2009 à 15:39:21
Papa Ours.
Avatar
Flux RSS

Études : Ensimag

Dj Kyk > Euh ouais, "0b" ça n'existe pas en C, probablement une extension quelconque d'un vendor, faut pas mettre ça dans le tuto.

Par contre, c'est bien "minimum".

raphamil > Mieux encore avec des enum, tu peux faire ça :
enum {
NO_FLAG,
FLAG_A,
FLAG_B = FLAG_A << 1,
FLAG_C = FLAG_B << 1,
FLAG_D = FLAG_C << 1
};

Évite d'avoir à se préoccuper des valeurs exactes, et s'étend facilement, même si tu veux ajouter une valeur en plein milieu.
 
Hors ligne iCe_sCrEAm # Posté le 11/12/2009 à 10:10:40
Smoking heals
Avatar

Ahhh Super ..
Alors c'est comme ca que ca marche les Flags !!

#include <www.siteduzero.com>

#ifnread tuto_c++
#read tuto_c++
 
Hors ligne ZéroZéroHuit-008 # Posté le 14/01/2010 à 20:20:45
Avatar

Ah, le problème des flags en C enfin éclaircit :) Bon tuto, clair et explicite malgré les calculs un peu plus "techniques" :p

Citation : rz0

raphamil > Mieux encore avec des enum, tu peux faire ça :
enum {
NO_FLAG,
FLAG_A,
FLAG_B = FLAG_A << 1,
FLAG_C = FLAG_B << 1,
FLAG_D = FLAG_C << 1
};

Évite d'avoir à se préoccuper des valeurs exactes, et s'étend facilement, même si tu veux ajouter une valeur en plein milieu.


Ooh, bien joué, ça mériterais de figurer dans le tuto.
Hors ligne LaTomateFrivole # Posté le 22/06/2010 à 19:41:21
My only wish is to be EATEN
Avatar

Très bon tuto.

Macintosheux
Métaleux, Noiseux
Bidouilleur d'ambiances à ses heures perdues
 
Hors ligne Quentin Guibert # Posté le 03/07/2010 à 16:00:17
Avatar

Ville : Saint martin de valgalgues
Pays : France métropolitaine

Salut,

Citation : Dj Kyk

A shuss et à PY : le préfixe "0b" n'existe pas ni en C ni en C++ à ma connaissance. En tout cas chez moi ça ne marche pas et il me renvoie une erreur.


Bah, c'est une extension du compilateur GCC, donc...
Donc, je conseillerai à l'auteur de retirer ces préfixes ou alors de conditionner la compilation du code source en testant la constante symbolique '__GNUC__' qui indique si on utilise un compilateur GNU (normalement, elle est définie par les compilateurs GNU qui utilisent le préprocesseur du langage C (cpp)).

Code : C
1
2
3
4
5
#ifdef __GNUC__
   /* On peut utiliser le préfixe '0b' ! */
#else
   /* On ne peut pas utiliser le préfixe '0b'... */
#endif


Petite erreur ici :

Citation : PY

Notez qu'il est possible de vérifier si 2 flags sont passés en même temps en écrivant if ((flags & (FLAG_A | FLAG_B) ) !=0).



Pour vérifier si deux drapeaux ont été passés dans l'argument séparés par un OU inclusif, on fait ceci :

Code : C
1
2
if ((drapeaux & (DRAP_1 | DRAP_2)) == (DRAP_1 | DRAP_2))
   /* Les drapeaux 'DRAP_1' et 'DRAP_2' ont été passé dans l'argument séparés par un OU inclusif ! */


En tout cas, beau tutoriel : clair, net, GG ! (:
Hors ligne Pier-Yves Lessard # Posté le 15/09/2010 à 04:48:49
Avatar

Avis : Très bon

J'ai corrigé certains points au tuto.
1) Un entier 8 bits peut stocker un maximum de 8 flag, et non un minimum.
2)Le préfixe 0b n'est pas suporté par tous les compilateurs, en effet. Je ne le savais pas lors de l'écriture de ce tutoriel.
3) Retiré al fausse affirmation sur le test de plusieurs flags dans le même if.
4)J'ai mit un bémol sur l'utilisation du type int pour des flags étant donné que la taille de l'entier est variable en fonction de la machine utilisé.

Merci à vous tous pour les commentaires pertinents et désolé du délai avant la correction de ces détails.
Hors ligne eLaps # Posté le 15/09/2010 à 20:27:48

Pourquoi ne pas présenter la définition des flags avec l'opérateur de décalage << (présenté mais inutilisé) ?
Les puissances de 2 ou l'hexadécimale sont beaucoup moins clairs que (1 << n).
Hors ligne uknow # Posté le 18/09/2010 à 03:42:31
chercher est un art
Avatar

Ville : Paris
Pays : France métropolitaine
Études : CNAM

Bonjour,

J'ai une petite remarque concernant ceci :

Citation : ISO/IEC9899
The result of E1 << E2 is E1 left-shifted E2 bit positions; vacated bits are filled with zeros. If E1 has an unsigned type, the value of the result is E1 2^(E2), reduced modulo one more than the maximum value representable in the result type. If E1 has a signed type and nonnegative value, and E1 2^(E2) is representable in the result type, then that is the resulting value; otherwise, the behavior is undefined.


Citation : tuto
Ça devient encore plus compliqué si on décale une variable de type signé. Il faut tenir compte du premier bit qui détermine le signe du nombre. Si on attribue la valeur 127 (1111111) à une variable de type char (8 bit signés). Un décalage de 1 vers la gauche sera équivalent à -2 ou, en binaire, (1)1111110.


Même en considérant une implémentation codant les entiers négatifs en complément à 2 (ce qui ne sera pas forcément le cas), le résultat de 0x7F << 1 n'est as défini. Or toi tu le définis comme étant 0xFE ce qui ne sera pas forcément le cas.

Ma deuxième remarque est que j'ai l'impression que tu ne mets pas les lecteurs en garde contre l'utilisation des opérateurs bit-wise, qui nécessite une vigilance considérable pour avoir un code portable.

Sinon le tutoriel m'a l'aire bien rédigé.
 
Hors ligne perseeverat # Posté le 20/12/2011 à 18:06:30
Avatar

Ville : Saint-benoÎt
Pays : Réunion

Joli tuto.
Ma lanterne est un peu plus éclairée sur les flags.
Petite faute de frappe dans la correction du QCM à la troisième question:

Il faut écrire 10000111 & 11010011 = 10000011

au lieu de 10000111 & 1101001 = 10000011
Pour accéder à cette section
Connectez-vous !
connexion_rpx