切换语句很多参数和处理相同

时间:2017-03-08 11:52:30

标签: c arduino switch-statement

我使用switch Case来选择函数变量是由serial(Ardiuino)实现的。例如,如果我写UP或Up甚至同样的处理并且调用相同的动作 我做到了,但我得到了更长的文字,可以减少它  代码在上面

switch (instruction[0])
    {
     case 'P' :

                  switch (instruction[1])
            {
             case 'A' :
                        PA(x,y);
             break ; 
             case 'R' :
                      PR(x,y);
             break ; 
             case 'U' :
                      PU(x,y);
             break ; 
             case 'D' :
                      PD(x,y);
             break ;  

            case 'a' :
            PA(x,y);
             break ; 
             case 'r' :
                      PR(x,y);
             break ; 
             case 'u' :
                      PU(x,y);
             break ; 
             case 'd' :
                      PD(x,y);
             break ;   
            }

        break;
        case 'p' :

                  switch (instruction[1])
            {
             case 'A' :
                        PA(x,y);
             break ; 
             case 'R' :
                      PR(x,y);
             break ; 
             case 'U' :
                      PU(x,y);
             break ; 
             case 'D' :
                      PD(x,y);
             break ;  

            case 'a' :
            PA(x,y);
             break ; 
             case 'r' :
                      PR(x,y);
             break ; 
             case 'u' :
                      PU(x,y);
             break ; 
             case 'd' :
                      PD(x,y);
             break ;   
            }              
        break;





     case 'T' :
        Serial.println("error");
        break;
     case 'A' :

            switch(instruction[1])
            {
              case 'A' :
                  AA(x,y,z);
              break;  
              case 'a' :
                AA(x,y,z);
              break;  

            }
        break;

      case 'a':     
            switch(instruction[1])
            {
              case 'A' :
                  AA(x,y,z);
              break;  
              case 'a' :
                AA(x,y,z);
              break;  

            }
        break;

}

4 个答案:

答案 0 :(得分:1)

一种方法是使用开关通过。虽然在您的情况下,您将不得不以嵌套的方式使用它。

像这样。

switch (instruction[0])
{
    case 'P' :
    case 'p' :

        switch (instruction[1])
        {
            case 'A' :
            case 'a' :
                PA(x,y);
            break ; 

            case 'R' :
            case 'r' :
                  PR(x,y);
             break ; 

            case 'U' :
            case 'u' :
                  PU(x,y);
            break ; 

            case 'D' :
            case 'd' :
                  PD(x,y);
            break ;  
        }
    break;
    case 'T' :
    case 't' :
        Serial.println("error");
        break;

    case 'A' :
    case 'a' :
        switch(instruction[1])
        {
            case 'A' :
            case 'a' :
                  AA(x,y,z);
            break;  
        }
    break;
}

请注意,在各种switch语句中不会处理默认情况。如果用户输入值“px”,您需要决定要采取的操作。目前,此代码不采取任何措施。

答案 1 :(得分:0)

更改代码如下:

          case 'A' :
              AA(x,y,z);
          break;  
          case 'a' :
            AA(x,y,z);
          break;  

为:

          case 'A' :
          case 'a' :
              AA(x,y,z);
          break;  

你仍然有一些荒谬的代码重复。你为什么不使用像查找表这样的东西?或者甚至是if / else if树,它将消除对所有break语句的需求?或toupper

答案 2 :(得分:0)

您可以使用strcasecmp()来比较两个字符串,但不关心字符的大小写。

if(strcasecmp(instruction, "pa") == 0)
  {
  PA(x,y);
  }
else if(strcasecmp(intruction, "pr") == 0)
  {
  PR(x,y);
  }

答案 3 :(得分:0)

根据您对这些功能的灵活程度,您可以重构它们,以便将第二个字母作为参数。

所以,而不是

PA(x,y);
PR(x,y);
PU(x,y);
PD(x,y);
...

使用

P( c, x, y );

并移交ARUD等等(即instruction[1])参数c。< / p>