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 :

Comment travailler avec des bits ?


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 434
    Points : 82
    Points
    82
    Par défaut Comment travailler avec des bits ?
    Bonjour, j'ai besoin pour un jeu en réseau, d'envoyer l'état des touches du clavier, il faut que ça tienne le moins de place.
    Si je fait une liste de bool ça tiendra 1 octet par touche, comment travailler avec les bits (ce qui me permettrait de stocker 16 touches par octet) ?

    Merci

  2. #2
    screetch
    Invité(e)
    Par défaut
    16 touches par octet c'est optimiste, un octet est constitué de 8 bits.

    regarde les operateurs &,|,>>,<< sur les entiers

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 434
    Points : 82
    Points
    82
    Par défaut
    :-) oui 8 biensur...
    Sinon j'ai trouvé un code avec lequel j'ai juste un peu de mal sur le union car ilme manque quelques bases, je n'arrive pas à déclarer la variable 'mot' dans une classe:

    typedef struct{
    uchar b0:1; //Poid faible
    uchar b1:1;
    uchar b2:1;
    uchar b3:1;
    uchar b4:1;
    uchar b5:1;
    uchar b6:1;
    uchar b7:1; //Poid fort
    }octet;


    union _mot{
    char valeur;
    octet etat;
    }mot;

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 434
    Points : 82
    Points
    82
    Par défaut
    J'ai retrouvé la bonne fonction dans mes archives perso, pour ceux que ça interresse:

    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
    union OCTET       
    {
        unsigned char dec;    /* decimal */
        struct
        {
            bool    bit7:1; /* binaire, le :1       */
            bool    bit6:1; /* signifie que la       */ 
            bool    bit5:1; /* variable n'intervient */
            bool    bit4:1; /* que sur un seul bit   */
            bool    bit3:1; /* de la structure       */
            bool    bit2:1;
            bool    bit1:1;
            bool    bit0:1;
        };
    };
    8 états dans un octet

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 572
    Points
    41 572
    Par défaut
    Sauf que c'est tout sauf portable: Le standard ne garantit absolument pas l'ordre des champs de bits, donc ce que tu appelles "bit7" peut très bien se retrouver en poids faible sur une plate-forme et en poids fort sur une autre...

    (et non, ce n'est pas une question d'endianness).

    De plus, le unsigned char dec n'est pas "décimal", mais "unsigned char", tout simplement.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Le plus simple pour manipuler les bits est d'utiliser std::bitset.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 434
    Points : 82
    Points
    82
    Par défaut
    Pas moyen de lancer la version debug avec l'include bitset:
    msvcr80D.dll was not found

    Si je ne fais une application que pour windows (ce qui est le cas) est-ce que j'ai le risque d'inversion des poids ?
    Pour le unsigned char au lieu d'un decimal ça n'a pas vraiment d'importance puisque le chiffre ne dépasse pas 16...

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 572
    Points
    41 572
    Par défaut
    Citation Envoyé par supergrey Voir le message
    Si je ne fais une application que pour windows (ce qui est le cas) est-ce que j'ai le risque d'inversion des poids ?
    Oui, car ça peut changer d'un compilo à l'autre.
    Pour le unsigned char au lieu d'un decimal ça n'a pas vraiment d'importance puisque le chiffre ne dépasse pas 16...
    Tu ne comprends pas.
    Dans un char, le nombre n'est pas plus "en décimal" qu' "en octal" ou "en binaire" : Le nombre est stocké de la façon dont l'ordi stocke les nombres. C'est tout.

    Le nombre ne peut être dit "en décimal" qu'à partir du moment où tu le convertis en chaîne de caractères, ou quand tu l'affiches sous forme décimale...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    Salut,

    Pour ton problème de dll non trouvée: une petite recherche sur google m'a permis de trouver une piste:
    1. télécharger vcredist_x86.exe et l'installer, si ce n'est déjà fait
    2. chercher le dossier contenant la dll manquante
    3. la placer dans le GAC (Global Assembly Cache)


    Pour info
    Citation Envoyé par quelqu'un sur un autre forum
    Le GAC est le Global Assembly Cache. Sous c:\windows\assembly.

    Les fichiers assemblies sont recherchés en priorité dans le répertoire de ton application (dans le bin), puis dans le gac et ensuite dans les chemins de recherches.

    Attention, le gac n'est pas un répertoire. C'est une référence.

    Le GAC est plus qu'un cache

    En gros, ta dll va se trouver dans un dossier du genre :
    C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\msvcr80d.dll
    Tu fais un drag'n'drop dans le dossier c:\windows\assembly

    En réalité, cela ne copiera ni ne déplacera pas le fichier. Il existera toujours à son emplacement d'origine, mais il sera connu de toutes les applications .Net 1.0 1.1 2.0 et 3.0.

    Tu peux aussi l'enregistrer dans le GAC par ligne de commande :
    gacutil /i nom_de_la_dll.dll
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 572
    Points
    41 572
    Par défaut
    Ce lien pointe sur le vieux VCRedist, sans le SP1.
    Et de toute façon, la version Debug n'est pas redistribuable, donc ça ne marchera pas.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 434
    Points : 82
    Points
    82
    Par défaut
    Bon j'ai installé vcredist et la dll en question est introuvable dans les sous dossiers de C:\WINDOWS\Microsoft.NET.
    J'ai donc téléchargé la dll sur dll-files.com et quand j'essay de la mettre dans assembly, ça me dit msvcr80d.dll was expected to contain an assembly manifest.
    Donc voila, pas moyen d'utiliser bitset.

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 572
    Points
    41 572
    Par défaut
    Tu es sous Visual, non?
    Normalement, si tu as visual d'installé, tu as aussi MSVCR80D installée. J'ai eu ces problèmes au début, ils se sont résolus tout seuls après quelques reboots.

    Essaie de voir en lançant ton programme dans le debugger (flèche verte pleine)...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 434
    Points : 82
    Points
    82
    Par défaut
    Je suis sous Visual Studio Express 2005, j'ai aussi installé platform sdk.
    En release ça se lance(surement parceque la version release de la dll existe), mais pas en debug, il manque la dll.

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 434
    Points : 82
    Points
    82
    Par défaut
    Pour en revenir à mon union OCTET puisque c'est la seule solution qui fonctionne, Médinoc dis que l'odre des champs de bits n'est pas garanti et peut donc changer d'un compilo à l'autre, d'ou m'a question un compilo c'est un truc que je connais pas ou c'est le petit nom de compilateur ? Dans le deuxième cas ça veut dire qu'une fois compilé, il n'y a plus de risque que ça change ?

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 572
    Points
    41 572
    Par défaut
    compilo c'est le petit nom de compilateur.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment travailler avec des gros fichiers
    Par gilles06 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 11/02/2008, 10h44
  2. Comment travailler avec le port IEEE 1394?
    Par Cornejito dans le forum MFC
    Réponses: 6
    Dernier message: 04/05/2005, 14h22
  3. Réponses: 3
    Dernier message: 25/01/2005, 11h27
  4. Comment travailler avec le client ?
    Par mathieu dans le forum Gestion de projet
    Réponses: 3
    Dernier message: 12/10/2004, 20h56
  5. Travailler avec des bits
    Par Vulvulune dans le forum Langage
    Réponses: 5
    Dernier message: 02/03/2003, 19h09

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