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 :

Demande précision sur Instruction en C


Sujet :

C

  1. #1
    Membre régulier
    Homme Profil pro
    retraité
    Inscrit en
    Avril 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Avril 2019
    Messages : 49
    Points : 70
    Points
    70
    Par défaut Demande précision sur Instruction en C
    Bonjour.
    En analysant les programmes exemples en C pour le Raspberry pico, je rencontre ces 2 instructions qui me posent problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // Set pid and flip for next transfer
        val |= ep->next_pid ? USB_BUF_CTRL_DATA1_PID : USB_BUF_CTRL_DATA0_PID;
        ep->next_pid ^= 1u;
    Si j’interprète bien la première instruction : si ep->next_pid est vrai alors val contiendra son ancienne valeur combinée avec un or logique avec la valeur de USB_BUF_CTRL_DATA1_PID.
    Et si ep->next_pid est faux val sera combinée avec or et la valeur de USB_BUF_CTRL_DATA0_PID.

    Est-ce bien cela ?

    Après analyse des instructions C précédant celles ci, il s'avère que ep->next_pid ne peut contenir que 0 ou 1 donc l'instruction ep->next_pi ^=1u équivaut à ep->next_pid= 0.
    Pourquoi donc faire un ou exclusif ? y-a-t-il une raison cachée ?

    merci.

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Salut
    Citation Envoyé par vincent Boulou Voir le message
    ...alors val contiendra son ancienne valeur combinée avec un or logique avec la valeur...

    Est-ce bien cela ?
    Presque. Ce n'est pas un "or logique" mais un "or bit à bit". La nuance est importante. Par exemple "1 || 2" donne 1 ou 2 selon les implémentations mais 1|2 donne 3.

    Citation Envoyé par vincent Boulou Voir le message
    Après analyse des instructions C précédant celles ci, il s'avère que ep->next_pid ne peut contenir que 0 ou 1 donc l'instruction ep->next_pi ^=1u équivaut à ep->next_pid= 0.
    Pourquoi donc faire un ou exclusif ? y-a-t-il une raison cachée ?
    Pareil, ep->next_pi^=1u équivaut à ep->next_pid=0 uniquement si ep->next_pid contient 1 or tu viens de dire qu'il peut contenir 0. Non, ep->next_pi^=1u équivaut à ep->next_pid=!ep_next_pid (ou ep->next_pid=ep_next_pid ?0 :1 si tu veux être plus parlant).
    Ensuite il faut faire super gaffe. Si vraiment tu es sûr à 110% que ep->next_pid ne peut contenir que 0 ou 1, alors ok tu peux remplacer le xor mais perso j'ai un doute (le nom "next_pid" me faisant penser à un pid Unix/Linux, sa valeur est un nombre allant de 1 à 65535).

    Sinon la raison d'un ou exclusif (là encore "bit à bit") permet de switcher un flag sans toucher aux autres. Si on part du principe qu'une variable short contient 16 bits, elle peut alors stocker 16 drapeaux O/N chacun dédié à gérer une caractéristique. C'est par exemple ainsi que sont stockés les droits d'un fichier (un bit pour chaque "r", "w" et "x" plus 3 bits pour les "sst" ce qui donne 12 bits, reste 4 bits qui eux servent à caractériser le type de fichier).
    Si par exemple la variable vaut 01000011, alors la filtrer par un xor sur 2u (perso j'écrirais plutôt 0x02) donnera 01000001. Et la même manip la fera repasser à 01000011. Bref le second bit passe de 0 à 1 et inversement sans importuner les autres.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre régulier
    Homme Profil pro
    retraité
    Inscrit en
    Avril 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Avril 2019
    Messages : 49
    Points : 70
    Points
    70
    Par défaut
    Merci de votre réponse.
    J'avais pas percuté que les instructions | et || pouvaient avoir des résultats différents.

Discussions similaires

  1. Réponses: 16
    Dernier message: 26/08/2011, 22h02
  2. [C++] Demande précision sur Pattern Factory
    Par Aspic dans le forum C++
    Réponses: 36
    Dernier message: 25/08/2011, 12h40
  3. [MySQL] Demande précisions sur LOCK TABLE
    Par renaud26 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 15/04/2011, 13h49
  4. Demande de précision sur "Extends" ..
    Par Invité dans le forum Langage
    Réponses: 6
    Dernier message: 12/02/2006, 14h25
  5. Demande de précisions sur Backup/Restore et transactions
    Par lio33 dans le forum Connexion aux bases de données
    Réponses: 1
    Dernier message: 16/11/2005, 12h08

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