Condition multiple IF qui retourne la meme valeurs

Bonjour,
le code ci-dessous fonctionne mais j'ai l'impression que c'est repetitif, je ne trouve pas comment le simplifier.

Arduino 2.3.3, ATmega1284p.

if(keyboard.available())
    {     
        c = keyboard.read();    
        ks = c;
       
        bool ctrl = c & PS2_CTRL;         
        c = keymap.remapKey(c); 
        c = c & 0xFF;
        
        if((ks & 0xFF) == PS2_KEY_UP_ARROW) { 
          cputch(ks & 0xFF);
        } else if((ks & 0xFF) == PS2_KEY_DN_ARROW) { 
          cputch(ks & 0xFF);
        } else if((ks & 0xFF) == PS2_KEY_L_ARROW) { 
          cputch(ks & 0xFF);
        } else if((ks & 0xFF) == PS2_KEY_R_ARROW) { 
          cputch(ks & 0xFF);
        } else if((ks & 0xFF) == PS2_KEY_HOME) { 
          cputch(ks & 0xFF);
        } else if((ks & 0xFF) == PS2_KEY_END) { 
          cputch(ks & 0xFF);
        }  else if((ks & 0xFF) == PS2_KEY_HOME) { 
          cputch(ks & 0xFF);
        }  else if((ks & 0xFF) == PS2_KEY_END) { 
          cputch(ks & 0xFF);
        }  else if((ks & 0xFF) == PS2_KEY_PGUP) { 
          cputch(ks & 0xFF);
        }  else if((ks & 0xFF) == PS2_KEY_PGDN) { 
          cputch(ks & 0xFF);
        } else if(ctrl) {                      
            cputch(c & 0x1F); // CTRL-KEY            
        } else if (c > 127) {
              continue;
        } else {
            cputch(c);                    
        }
    }

J'utilise les libraries PS2KeyAdavnces et PS2Keymap.

Merci.

Bonjour,

Si l'action à réaliser pour chaque if est la même pour plusieurs if

Alors tu peux faire un OR qui s'écrit "||".

Comme cela:

if ( a || b || c ||){
faire ceci;
}

Bonjour andromeda92

Tu as 2 solutions, ou toutes les touches ont des valeurs contiguës et tu peux faire:
if(((ks & 0xFF) >= PS2_KEY_xxx) && ((ks & 0xFF) <= PS2_KEY_yyy) )

ou elles ne sont pas contiguës et tu devra faire:
if((ks & 0xFF) == PS2_KEY_HOME || ks & 0xFF) == PS2_KEY_END || ks & 0xFF) == PS2_KEY_PGUP ... etc)

Attention, dans ton exemple, tu as plusieurs fois la même touche testée :wink:

Pour avoir les codes des touches, dans l'IDE, fait un clic droite sur PS2_KEY_L_ARROW par exemple et sur Go to definition, tu aura toute la liste.

Cordialement
jpbbricole

Bonjour,

Sauf erreur de ma part, que les valeurs PS2_KEY_XXX soient contiguës ou pas, un bloc switch/case pour le test de celles-ci et à la place des if/else devrait faire l'affaire...

Quant aux 3 derniers tests

if (ctrl) {                      
    cputch(c & 0x1F); // CTRL-KEY            
} else if (c > 127) {
    continue;
} else {
    cputch(c);                    
}

ceux-ci peuvent être mis dans le default du switch/case

Bonjour jpbbricole, j'avais pensé à cette solution, je pense que ca devrait fonctionné.

Pas sur qu'avec le switch ca peut fonctionner dans mon cas, j'ai peur d'une erreur et que ca passe au 3 if, il ne faut pas que le test se fasse si une condition est accepté, ca peut le faire mais il peut y avoir un risque.

Comme c'est contigu le if a fonctionné, ce qui m'a réduit à une seule ligne les tests.
Merci.

un IF multiple ou un switch c'est globalement la même chose si tu un test d'égalité.

Tout à fait d'accord, je préfère utiliser les switch que les if, dans mon cas non, si je fais le switch et que la condition est rempli, si je fais un if après il passera obligatoirement sur le else cputch, et il ne faut pas, dans mon cas. car dans le switch je ne fais pas de return, ce n'est pas le fonctionnement que je souhaite.

Désolé je ne comprends pas ce que tu veux dire.
Tout les IF(ks & 0xFF) == ...) sont équivalant à un switch(ks & 0xFF)
le défaut du switch contiendra comme l'indique @claudius01 le IF.ELSEIF.ELSE
Je ne vois pas ce que ton code à de spécifique?

oui exact si c'est dans le défaut du switch je suis ok, donc j'ai mal compris ce qu'il voulais dire.
Je pensais que c'était hors du switch.
Du coup comme j'ai réduit à deux if, ce n'est pas nécessaire de faire un switch.

Oui, tout à fait.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.