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ébutant]Fonction avec des flags


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2005
    Messages : 45
    Points : 28
    Points
    28
    Par défaut [Débutant]Fonction avec des flags
    Bonjours,

    Je voudrait savoir comment créer une fonction avec un groupe de flags, comme SDL_Init( SDL_INIT_VIDEO | SDL_INIT_AUDIO)

  2. #2
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    tu peux prendre exemple sur les flags de la SDL :

    Citation Envoyé par SDL.h
    [...]
    #define SDL_INIT_TIMER 0x00000001
    #define SDL_INIT_AUDIO 0x00000010
    #define SDL_INIT_VIDEO 0x00000020
    #define SDL_INIT_CDROM 0x00000100
    #define SDL_INIT_JOYSTICK 0x00000200
    [...]
    Si en plus tu sais que l'oprateur bit à bit | réalise un ou inclusif logique, tu as toutes les cartes en main pour réaliser une fonction avec des flags.

    Dans ton exemple, la fonction SDL_Init ne prend qu'un argument, qu'il suffit d'analyser pour retrouver tous les flags positionnés. Le tout étant que les valeurs définies pour chaque flag ne puissent jamais se recouper

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2005
    Messages : 45
    Points : 28
    Points
    28
    Par défaut
    Qu' est ce qu' exactement un ou inclusif logique?

    Est-ce qu' au finale, j' aurais une addition des nombres?

    Edit : non, ça va, j' ai compris.

    Pour çeux qui voudrait le savoir :

    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
     
    #define FLAG1 100
    #define FLAG2 010
    #define FLAG3 001
     
    void fonction_avec_flags(int flag)
    {
         if(flag == 110)
         {
              //Les flags : 1 et 2
         }
         else if(flag == 010)
         {
              //Les flags : 2
         }
         else if(flag == 111)
         {
              //Les flags : 1, 2 et 3
         }
    }

  4. #4
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Qu' est ce qu' exactement un ou inclusif logique
    L'opération OU logique (inclusif) correspond à (a et b étant deux bits)
    a|b == 1 si a == 1 ou si b == 1 ou si les deux valent 1 (inclusif)
    ce qui revient à dire
    a|b == 0 si a == 0 et si b == 0
    En repartant de l'exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #define SDL_INIT_TIMER 0x00000001 
    #define SDL_INIT_AUDIO 0x00000010 
    #define SDL_INIT_VIDEO 0x00000020
    ......
    SDL_INIT_AUDIO | SDL_INIT_VIDEO == 0x00000030
    Est-ce qu' au finale, j' aurais une addition des nombres?
    Ceci est différent d'une addition. Exemple :
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  5. #5
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Dans ton exemple c'est un OU binaire.

    0x01 | 0x02 -> 0x03 OU Binaire.

    0x01 || 0x02 -> 0x01 OU Logique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <stdlib.h>
    #include <iostream.h>
     
    int main() {
    char Pause;
     
    cout << "OU logique : "<< 0x01 << " || " << 0x02 << " vaut "<< (0x01 || 0x02)<<endl;
     
    cout << "OU binaire : "<< 0x01 << " | " << 0x02 << " vaut "<< (0x01 | 0x02)<<endl;
     
    cin >> Pause;
    return EXIT_SUCCESS;	
    }
    Et pour mélanger des flags, c'est bien le OU binaire qu'il faut utiliser.
    Ainsi que le ET binaire.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2005
    Messages : 45
    Points : 28
    Points
    28
    Par défaut
    Merci à toi,

    mais à quoi sert le & exactement?

  7. #7
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    Citation Envoyé par @r$£~%[
    mais à quoi sert le & exactement?
    lorsqu'il est placé entre 2 valeurs, c'est l'opérateur bit à bit ET (le ET binaire dont parle Caine)
    et lorsqu'il est placé devant une variable, c'est l'opérateur d'adressage (qui retourne l'adresse mémoire de la variable)

  8. #8
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Caine a écrit
    0x01 || 0x02 -> 0x01 OU Logique
    Dans le cas du OU (||) ce résultat n'est pas évident. Il s'agit de manipuler des grandeurs booléennes true/false.
    Certes, false est en général représenté en machine par 0 et true par != false. L'utilisateur n'a pas à savoir comment est représenté true (c'est une question d'abstraction des données) ni d'ailleurs false. l'opérateur || doit être utilisé avec des opérandes à type booléens, dont les valeurs sont true ou false, et fournit une réponse booléenne.
    Ta proposition doit s'énoncer true || true == true. Pas plus
    [Edit]
    khayyam90 peut également ajouter à la liste des utilisations de & les références.
    [/Edit]
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2005
    Messages : 45
    Points : 28
    Points
    28
    Par défaut
    Et à quoi sert l' operateur ET bit à bit?

  10. #10
    Membre averti Avatar de Bob.Killer
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    336
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 336
    Points : 332
    Points
    332
    Par défaut
    c une comparaison pour voir si les bits que tu veux vérifier sont allumé ou éteind.

    ex :

    chiffre que tu veux vérifier : 0x25 (00100101)
    masque pour voir si le dernier bit est allumé : 0x01 (00000001)

    tu fais un ET bit à bit :
    -> condition = true car le bit cherché est allumé dans le chiffre
    Pensez aux tutoriels programmation : http://programmation.developpez.com/cours-tutoriels/

  11. #11
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Je suis d'accord, mais tu parlais bien du résultat d'un OU binaire, seul cas qui garanti que 0x01 OU Binaire 0x02 == 0x03.

    Le résultat avec un OU Logique ne garanti pas d'obtenir 0x03.

    En d'autre terme, je dirais que :

    (A | B ) != (A || B)

    Sauf implémentation spécifique à un compilateur ou en raison des valeurs de A et B.
    Citation Envoyé par diogene
    Caine a écrit
    0x01 || 0x02 -> 0x01 OU Logique
    Dans le cas du OU (||) ce résultat n'est pas évident. Il s'agit de manipuler des grandeurs booléennes true/false.
    Certes, false est en général représenté en machine par 0 et true par != false. L'utilisateur n'a pas à savoir comment est représenté true (c'est une question d'abstraction des données) ni d'ailleurs false. l'opérateur || doit être utilisé avec des opérandes à type booléens, dont les valeurs sont true ou false, et fournit une réponse booléenne.
    Ta proposition doit s'énoncer true || true == true. Pas plus
    [Edit]
    khayyam90 peut également ajouter à la liste des utilisations de & les références.
    [/Edit]

Discussions similaires

  1. [Débutant] Liste avec des valeurs associées aux string
    Par Bouillou dans le forum C++Builder
    Réponses: 3
    Dernier message: 16/03/2006, 18h11
  2. Réponses: 8
    Dernier message: 02/02/2006, 18h13
  3. Réponses: 6
    Dernier message: 24/02/2005, 09h44
  4. Erreur sur une fonction avec des paramètres
    Par Elois dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 05/05/2004, 21h00
  5. Une fonction avec des attributs non obligatoires
    Par YanK dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2002, 13h39

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