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 :

buf[3] = m_iComPort|0x30 : ligne de code incomprise


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 117
    Par défaut buf[3] = m_iComPort|0x30 : ligne de code incomprise
    salut à tous,

    Est ce que quelqu'un pourrait m'expliquer la signification de la partie en rouge de cette ligne de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    buf[3] = m_iComPort|0x30;
    Cette ligne se trouve dans la fonction d'ouverture du port série, je vous envoie une partie du code pour que vous compreniez le contexte dans le code la ligne que je ne comprend pas est utilisée :
    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
    void l_serie::InitComPort(int iComPort) 
    { 
    	
    char buf[] = "COM1";
    if(iComPort!= NULL)
    m_iComPort = iComPort;
    if(m_iComPort == 1 || m_iComPort == 2)
    buf[3] = m_iComPort|0x30;
    else throw Err::ErrSeriePrtNmb();
    
    //////Création du fichier/////////
    
    m_hCom= CreateFile (buf,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
    cout<<buf<<endl;
    ....
    Merci bp pour votre aide et très bonne journée

  2. #2
    Membre éprouvé Avatar de nicO1077
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 107
    Par défaut
    Citation Envoyé par sanatou
    salut à tous,

    Est ce que quelqu'un pourrait m'expliquer la signification de la partie en rouge de cette ligne de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    buf[3] = m_iComPort|0x30;
    Cette ligne se trouve dans la fonction d'ouverture du port série, je vous envoie une partie du code pour que vous compreniez le contexte dans le code la ligne que je ne comprend pas est utilisée :
    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
    void l_serie::InitComPort(int iComPort) 
    { 
    	
    char buf[] = "COM1";
    if(iComPort!= NULL)
    m_iComPort = iComPort;
    if(m_iComPort == 1 || m_iComPort == 2)
    buf[3] = m_iComPort|0x30;
    else throw Err::ErrSeriePrtNmb();
    
    //////Création du fichier/////////
    
    m_hCom= CreateFile (buf,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
    cout<<buf<<endl;
    ....
    Merci bp pour votre aide et très bonne journée
    Bonjour,
    Le |0x30 c'est un masque qui est fait sur ce que contient m_iComPort
    Va voir la signification des masques, tu en as du genre | et avec &, qui ont tout les deux leur spécification !!

  3. #3
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    ce sont des opérateurs binaires ("|" == OU, "&" == ET), c'est a dire que ça fait un OU bit à bit entre m_iComPort et 0x30.

  4. #4
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 117
    Par défaut
    Salut Nicco 1077,
    Merci bp de m'avoir répondu mais je ne trouve pas de documentations concernants les masques...
    Tu connaittrais pas des liens ou des sites où je pourrais trouver des renseignements...

    Merci bp...

  5. #5
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 117
    Par défaut
    salut Faiche,
    Merci pour la réponse, mais que veut dire justement le "ou 0x30" dans ce cas...

    Merci de m'aider...

  6. #6
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    0x30 est un nombre hexadécimal. Ca représente 00110000 en notation binaire.

    L'instruction "buf[3] = m_iComPort|0x30;" n'est effectuée que si m_iComPort est égal à 1 ou 2 (soit 00000001 ou 00000010 en binaire).

    m_iComPort|0x30; est égal à 00110001 si m_iComPort égale 1 et à 00110010 si m_iComPort égale 2.

    En gros tu pourrais remplacer ces deux lignes par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(m_iComPort == 1)
        buf[3] = 49;
    if(m_iComPort == 2)
        buf[3] = 50;
    Edit : pas tout à fait, j'avais pas vu qu'il y avait un else

  7. #7
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 117
    Par défaut
    Merci pour ces éclaircissements...ça m'aide bp...
    Mais ce que je ne comprend pas c'est pourquoi on utilise ce masque!!!!!!

    Merci de m'aider sur ce point et très bonne journée à vous.....

  8. #8
    Membre expérimenté Avatar de Rupella
    Inscrit en
    Février 2005
    Messages
    286
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 286
    Par défaut
    pour en faire une donnée de type char... tout bêtement.
    tu te retrouveras avec COM1 ou COM2 dans la donnée string.

    une autre solution (qui revient exactement à la même chose), c'est d'ajouter 0x30 ou '0'.

  9. #9
    Membre éprouvé Avatar de nicO1077
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 107
    Par défaut
    Bonsoir,

    Pour un lien sur le site te donnant quelques exemples sur les masques, voir les opérateurs sur les bits http://4d.developpez.com/documentation/4DDoc2004/CMF/CMF02006.HTM

    Citation Envoyé par sanatou
    Mais ce que je ne comprend pas c'est pourquoi on utilise ce masque!!!!!!

    Merci de m'aider sur ce point et très bonne journée à vous.....
    Concernant l'utilité, il s'agit de tester la valeur d'un seul bit !!! Exemple : Pour le & Tu récupères un octet après avoir fait une lecture sur un port quelconque, et tu sais que le bit 2 de cet octet te précisera si tu as un led allumé par exemple ! Dans ce cas, toi ne récupérant que l'octet entier, tu dois isoler la valeur du bit 2, parmis les 8 bits (de 0 à 7) que contiendra ton octet.
    Ici je parle pour isoler 1 seul bit, mais tu peux isoler une partie !! Si par exemple ce qui t'intéresse n'est que le bit 2 et 3, ou le bit 4 et 0 etc...

    Le & pour la mise à 0, et le | pour la mise à 1 (pour piloter une carte E/S par exemple) (Moi c'est comme ça que je m'en rappelle !! )

    En gros, pour ton exemple :
    Si m_iComPort vaut 0x8A, en binaire ça vaudra :
    Num du bit : b7---------->b0
    Etat du bit : 1 0 0 0 1 0 1 0

    Ton masque 0x30 vaut :
    Num du bit : b7---------->b0
    Etat du bit : 0 0 0 0 0 0 1 1

    Tu fais un masque en appliquant ton OU bit à bit, donc m_iComPort | 0x30, tu obtiendras alors :
    Etat des bit m_iComPort : 1 0 0 0 1 0 1 0
    Etat des bits du masque : 0 0 0 0 0 0 1 1
    ------------------------------------------
    Resultat apres le masque: 1 0 0 0 1 0 1 1

    Bonne soirée !!

  10. #10
    Invité
    Invité(e)
    Par défaut
    si tu veux essayer de comprendre pourquoi on utilise des masques, tu peux toujours lire ceci. c'est un article que j'ai écrit sur les Flags, mais qui pourrait t'etre utile a comprendre certaines notions binaires (par contre, désolé si t'es allergique a l'anglais )...

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Citation Envoyé par nicO1077
    Tu fais un masque en appliquant ton OU bit à bit, donc m_iComPort | 0x30, tu obtiendras alors :
    Etat des bit m_iComPort : 1 0 0 0 1 0 1 0
    Etat des bits du masque : 0 0 0 0 0 0 1 1
    ------------------------------------------
    Resultat apres le masque: 1 0 0 0 0 0 1 1
    Oh, arrête la moquette, les acariens grillés ça attaque le cerveau... ©Emmanuel.
    Edit: Tu as corrigé, mais j'ai toujours une copie de ta fausse opération!

    Ici, le OU logique sert à s'assurer que les deux bits soient à 1. L'instruction sert à mettre ces deux bits à 1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Etat des bit m_iComPort : 1 0 0 0 1 0 1 0
    Etat des bits du masque : 0 0 0 0 0 0 1 1
    ------------------------------------------
    Resultat apres le masque: 1 0 0 0 1 0 1 1
    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.

  12. #12
    Membre éprouvé Avatar de nicO1077
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 107
    Par défaut
    Bonsoir à tous,
    Citation Envoyé par Médinoc
    Oh, arrête la moquette, les acariens grillés ça attaque le cerveau... ©Emmanuel.

    Ici, le OU logique sert à s'assurer que les deux bits soient à 1. L'instruction sert à mettre ces deux bits à 1.
    Citation Envoyé par nicO1077
    Le & pour la mise à 0, et le | pour la mise à 1
    Eh bien oui, tu confirmes bien ce que j'ai dit !!

    PS : Merci pour les acariens, je savais pas !!! Je ferais attention dorénavant !!

Discussions similaires

  1. Lignes de code incomprises
    Par miss_angel dans le forum Débuter
    Réponses: 4
    Dernier message: 24/08/2012, 16h47
  2. ~var; ligne de code incomprise
    Par sanatou dans le forum C++
    Réponses: 5
    Dernier message: 20/11/2006, 15h00
  3. Réponses: 3
    Dernier message: 08/11/2006, 09h54
  4. lignes de code incomprises
    Par sanatou dans le forum C++
    Réponses: 2
    Dernier message: 25/10/2006, 21h28
  5. Calculeur de ligne de code
    Par Bernybon dans le forum Autres éditeurs
    Réponses: 9
    Dernier message: 05/03/2004, 16h29

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