decodage 2 bits : if ou case swtich ?

bonjour,

en fonction de l'etat logique sur 2 bits = 4 etats possibles, je fais executer 4 functions différentes, avec l'instruction if et comparaisons d'état tres basique comment faire la meme chose avec un switch case 4 "cas" ? le code avec des if :

void setup(void) {
  pinMode(a, INPUT_PULLUP);
  pinMode(b, INPUT_PULLUP);

}

void loop(void) {
  
   a1=digitalRead(a);
  b1=digitalRead(b);
  if (a1==0 && b1==0){ draw();}
  if (a1==1 && b1==0){ draw1();}
 if (a1==0 && b1==1){draw2();} 
  if (a1==1 && b1==1){ draw3();}
  
                   }

merci

Bonjour,

Il suffit de combiner les deux états:

void loop() {
  // put your main code here, to run repeatedly:

  a1 = digitalRead(a);
  b1 = digitalRead(b);

  switch (a1 + 2*b1)
  {
    case 0:
      draw();
      break;
    case 1:
      draw1();
      break;
    case 2:
      draw2();
      break;
    case 3:
      draw3();
      break;
  }
}

A mon avis c'est moins explicite que le if.

kamill:
A mon avis c’est moins explicite que le if.

j’allais le dire :slight_smile:

On peut améliorer la lisibilité de la formule par

switch ( (a1 << 1) | b1 )

pour bien montrer qu’on met les deux bits bout à bout (ne pas hésiter à mettre trop de parenthèses plutôt que pas assez car l’opérateur “<<” a une priorité piégeuse)

On peut aussi écrire les case en binaire pour la même raison, avec des 0b00 , 0b01 …

Mais personnellement, dans ce genre de situation, j’écrirais ça (en déclarant a1 et b1 de type “bool”) :

if (a1) {
    if (b1) {
        draw3();
    } else {
        draw1();
    }
} else {
    if (b1) {
        draw2();
    } else {
        draw();
    }
}

Bien sur si tu as simplifié le problème pour poser la question mais qu’en réalité y’a plus que 2 bits, le switch finira par être plus lisible que des tas de if imbriqués.

merci

c’est exactement çà : pour 2 bits avec des if c’est assez simple
si j’augmente le nombre de bits je vais avoir des difficultés avec des if
puisque le but final c’est decoder 4 bits

je n’ai aucune connaisssance du C ni des équations logiques

switch ( (a1 << 1) | b1 ) et switch (a1 + 2*b1), c’est du chinois pour moi

je capte soudainement que l’expression “c’est du chinois” est adaptée vu la provenance des modules arduino que j’utilise ( humour )

Bonjour,

Le but est de combiner touts les états en mettant un état par bit (0/1) pour avoir un état combiné.

etat a1 dans bit 0 → a1
etat b1 dans bit 1 → b1*2 ou b1<<1 (b1 décalé à gauche de 1)

état combiné → a1+2*b1 ou a1+(b1<<1)

Bonjour,

S'il y a 16 valeurs possibles (4 bits), le plus simple ne serait-il pas de créer un vecteur de 16 pointeurs de fonctions ? On calcule la valeur représentée par les 4 bits et on appelle la fonction depuis le vecteur.

De ce fait, pas de test. Chaque valeur à un temps d'appel équivalent. On gagne en concision et en lecture.

je n'ai aucune connaisssance du C

Ce n'est pas grave... Cela s'append facilement :-)

Coyotte

Bonjour, Content de voir ce sujet abordé, car je vais devoir commandé un multiplexeur (8 > 1), donc 3 bits de commande. J'ai quelques notions d'informatique et des neurones plutôt lents. J'avais envisagé d'utiliser la fonction « Switchcase », mais je réagis comme Electrax, à savoir qu'elle me paraît moins explicite. Si la première proposition d'Electrax avec des if est opérationnelle, je prends. C'est celle qui ressemble le plus à un tableau de vérité de multiplexeur, donc plus accessible aux non-informaticien. A moins que la dernière proposition de Coyotte mette tout le monde d'accord.

Le principe de la proposition de Coyotte est le même que pour le switch (combinaison des états), mais au lieu de faire le test dans un switch, il lance directement le programme à partir d'un tableau de pointeurs indexé par l'etat combiné.