有更整洁的方法吗?C++IF

Is there a neater way to do this? C++ IF

本文关键字:C++IF 方法      更新时间:2023-10-16

有没有更简洁的方法来完成这段代码?

它只是检查是否所有的电线都连接了&如果它们不是,那么连接到arduino的LCD上的品脱失败。

  //Check if all wires are connected
if (digitalRead(wire_BROWN) == LOW){
 if (digitalRead(wire_ORANGE) == LOW){
   if (digitalRead(wire_RED) == LOW){
    if (digitalRead(wire_GREEN) == LOW){
      if (digitalRead(wire_BLUE) == LOW){
        if (digitalRead(wire_PURPLE) == LOW){
          if (digitalRead(wire_GREY) == LOW){
            if (digitalRead(wire_WHITE) == LOW){
              if (digitalRead(wire_BLACK) == LOW){
                lcd.print(pass);
                delay(3000);
                lcd.clear();
                lcd.print("Status: ARMED");
                testPassed = true;
              } else lcd.print(fail);
            } else lcd.print(fail);
          } else lcd.print(fail);
        } else lcd.print(fail);
      } else lcd.print(fail);
    } else lcd.print(fail);
  } else lcd.print(fail);
 } else lcd.print(fail);
} else lcd.print(fail);

你可以把它放在一个函数中,使它更可读:

bool all_wires_low()
{
    return
        digitalRead(wire_BROWN) == LOW &&
        digitalRead(wire_ORANGE) == LOW &&
        digitalRead(wire_RED) == LOW &&
        digitalRead(wire_GREEN) == LOW &&
        digitalRead(wire_BLUE) == LOW &&
        digitalRead(wire_PURPLE) == LOW &&
        digitalRead(wire_GREY) == LOW &&
        digitalRead(wire_WHITE) == LOW &&
        digitalRead(wire_BLACK) == LOW;
}
// elsewhere:
if( all_wires_low() )
{
    lcd.print(pass);
    delay(3000);
    lcd.clear();
    lcd.print("Status: ARMED");
    testPassed = true;
}
else
{
    lcd.print(fail);
}

当有多个变量时,枚举它们总是更简单,这样可以让您循环遍历它们,而不必编写重复的代码。我个人喜欢将它们组织在一个单独的文件中,这样会更整洁,也更容易添加新值-

typedef enum {
#define DEF_WIRE(x) WIRE_ ## x,
#include "wires.def"
} wire_types;
int main() {
    bool testPassed = true;
    for (int wire = 0; wire < WIRE_MAX; ++wire) {
        testPassed &= (digitalRead(wire) == LOW);
    }
    if (testPassed) {
        lcd.print(pass);
        delay(3000);
        lcd.clear();
        lcd.print("Status: ARMED");
    } else {
        lcd.print(fail);
    }
}

其中wires.def具有:

DEF_WIRE(BROWN)
DEF_WIRE(ORANGE)
DEF_WIRE(RED)
DEF_WIRE(GREEN)
DEF_WIRE(BLUE)
DEF_WIRE(PURPLE)
DEF_WIRE(GREY)
DEF_WIRE(WHITE)
DEF_WIRE(BLACK)
DEF_WIRE(MAX)
#undef DEF_WIRE

一个附带的好处是,它可以让你做一些很酷的事情,比如:

const char* wire_names[] = {
#define DEF_WIRE(x) #x,
#include "wires.def"
};

然后

printf("wire %s is LOWn", wire_names[wire]);

您可以使用'and'运算符&&来组合多个条件:

if (digitalRead(wire_BROWN) == LOW &&
    digitalRead(wire_ORANGE) == LOW &&
    digitalRead(wire_RED) == LOW &&
    digitalRead(wire_GREEN) == LOW &&
    digitalRead(wire_BLUE) == LOW &&
    digitalRead(wire_PURPLE) == LOW &&
    digitalRead(wire_GREY) == LOW &&
    digitalRead(wire_WHITE) == LOW &&
    digitalRead(wire_BLACK) == LOW){
  lcd.print(pass);
  delay(3000);
  lcd.clear();
  lcd.print("Status: ARMED");
  testPassed = true;
} 
else {
  lcd.print(fail);
}

您可以尝试

if ( (digitalRead(wire_BROWN) == LOW) && (digitalRead(wire_ORANGE) == LOW) && ... /* other checks */)
{
   lcd.print(pass);
   delay(3000);
   lcd.clear();
   lcd.print("Status: ARMED");
   testPassed = true;
}else
{
   lcd.print(fail);
}

让我们得到一个信号来回答问题:是所有信号都为低电平或至少其中一个信号为高电平。这个答案由简单的"&amptoggle保证将所有信号组合起来产生一个信号,并为问题提供一个明确的答案——所有信号都低吗?

将该信号的结果与LOW进行比较。

  if((digitalRead(wire_BROWN)  &
    digitalRead(wire_ORANGE) & 
    digitalRead(wire_RED)    &
    digitalRead(wire_GREEN)  &
    digitalRead(wire_BLUE)   &
    digitalRead(wire_PURPLE) &
    digitalRead(wire_GREY)   &
    digitalRead(wire_WHITE)  &
    digitalRead(wire_BLACK) ) & LOW)
    {
    ....
    ...
    }

您可能应该使用&amp;以缩短代码。此外,如果您的有线变量在同一端口上,您可能能够对它们进行AND(&)运算。

无论如何:

if(digitalRead(wire_BROWN) == LOW && digitalRead(wire_ORANGE) == LOW && ... ) {
   lcd.print(pass);
   delay(3000);
   lcd.clear();
   lcd.print("Status: ARMED");
   testPassed = true;
} else {
   lcd.print(fail);
}

只需使用and运算符&&,因为它短路,一旦对digitalRead的任何调用未能返回LOW:,if语句就会变为false

if ((digitalRead(wire_BROWN) == LOW) &&
    (digitalRead(wire_ORANGE) == LOW) &&
    (digitalRead(wire_RED) == LOW) &&
    (digitalRead(wire_GREEN) == LOW) &&
    (digitalRead(wire_BLUE) == LOW) &&
    (digitalRead(wire_PURPLE) == LOW) &&
    (digitalRead(wire_GREY) == LOW) &&
    (digitalRead(wire_WHITE) == LOW) &&
    (digitalRead(wire_BLACK) == LOW)) {
                lcd.print(pass);
                delay(3000);
                lcd.clear();
                lcd.print("Status: ARMED");
                testPassed = true;
    } else {
        lcd.print(fail);
    }

我建议使用布尔变量和逻辑:

bool all_wires_connected = true;
all_wires_connected = all_wires_connected && (digitalRead(wire_BROWN) == LOW);
all_wires_connected = all_wires_connected && (digitalRead(wire_ORANGE) == LOW);
all_wires_connected = all_wires_connected && (digitalRead(wire_RED) == LOW);
all_wires_connected = all_wires_connected && (digitalRead(wire_GREEN) == LOW);
all_wires_connected = all_wires_connected && (digitalRead(wire_BLUE) == LOW);
all_wires_connected = all_wires_connected && (digitalRead(wire_PURPLE) == LOW);
all_wires_connected = all_wires_connected && (digitalRead(wire_GREY) == LOW);
all_wires_connected = all_wires_connected && (digitalRead(wire_WHITE) == LOW);
all_wires_connected = all_wires_connected && (digitalRead(wire_BLACK) == LOW);
if (all_wires_connected)
{
    lcd.print(pass);
    delay(3000);
    lcd.clear();
    lcd.print("Status: ARMED");
    testPassed = true;
}
else
{
    lcd.print(fail);
}

这可能会鼓励编译器使用有条件执行的指令。

由于这是一种嵌入式系统,我建议研究digitalRead()函数或宏的内容。

代码看起来像是每种导线颜色都表示为一个整数中的一位。有一种简单的方法可以测试是否所有位都被设置或清除(取决于LOWHIGH的表示)。

例如,如果是LOW == 0,则可以读取导线值并与零进行比较(一个if语句)。零值读取意味着所有位都为零,因此所有导线都为LOW。

一个if语句将比9个if语句更易于管理。

IMHO最好的解决方案是将它们放在一个数组中:

int allWires[] = { wire_BROWN, wire_ORANGE, wire_RED, wire_GREEN, wire_BLUE, wire_PURPLE, wire_GREY, wire_WHITE, wire_BLACK };

然后迭代它们:

testPassed = true;
for (i = 0; i < sizeof(allWires)/sizeof(int); i++)
{
    if (digitalRead(allWires[i]) == LOW)
        testPassed = false;
}
if (testPassed)
{
    lcd.print(pass);
    delay(3000);
    lcd.clear();
    lcd.print("Status: ARMED");
}
else
    lcd.print(fail);

创建一个位掩码,并将其与端口进行布尔and运算:https://www.arduino.cc/en/Tutorial/BitMask

顺便说一句。读取端口为:https://www.arduino.cc/en/Reference/PortManipulation


遮罩将看起来如下:00011111其中,0表示连接到有色电线以外的其他东西的所有位,1是您想要测试的。。。

您将使用两个端口,因此:

byte MASK2 = some bit pattern depending on wire arrangements;
byte MASK1 = some bit pattern depending on wire arrangements;
int PORTA = 
if(( MASK1 & PIND + MASK2 & PINB ) == 0)
{
    //code
}

这个答案必须等于0。