有更整洁的方法吗?C++IF
Is there a neater way to do this? C++ IF
有没有更简洁的方法来完成这段代码?
它只是检查是否所有的电线都连接了&如果它们不是,那么连接到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);
}
让我们得到一个信号来回答问题:是所有信号都为低电平或至少其中一个信号为高电平。这个答案由简单的"&toggle保证将所有信号组合起来产生一个信号,并为问题提供一个明确的答案——所有信号都低吗?
将该信号的结果与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)
{
....
...
}
您可能应该使用&;以缩短代码。此外,如果您的有线变量在同一端口上,您可能能够对它们进行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()
函数或宏的内容。
代码看起来像是每种导线颜色都表示为一个整数中的一位。有一种简单的方法可以测试是否所有位都被设置或清除(取决于LOW
或HIGH
的表示)。
例如,如果是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。
- 在 if 语句中处理多个 or 的更优雅的方法是什么
- MSVC使用constexpr-if从可变模板方法中的基本模板参数中吞下const
- 多个 if-else 测试的更简单方法
- 有没有更有效的方法来替换这些多个 IF 语句?
- 在创建完整对象之前编写 if-can-add check 方法的正确方法?
- 一种无需使用if语句而无需使用阈值的方法
- 减少 if-elseif 语句的聪明方法
- 用 c++ 编写一堆类似的 if 语句的漂亮方法
- 有没有更简单的方法可以做到:if(num1 > num2 && num1 > num3),以获得更大的变量列表进行比较?
- 有没有简单的方法可以在 if-else 链的末尾做与 else 相反的事情
- 具有"else if"方法问题 C++ 的基本计算器
- 将字符串中的特定单词与c 中的if或while进行比较的最佳方法
- 适当使用IF Goto循环的方法
- 通过找到一种删除许多 if 语句的方法来简化代码
- C++对方法和What-if所有东西都转到.h的未定义引用
- 将字符串存储在要在 IF 语句中使用的数组中的可能方法
- 不使用 if 插入/更新 std::unordered_map 元素的最快方法是什么
- 编写 if then else 类型语句的简洁方法
- 用c++编写if-then-else语句的更有效方法
- 有更整洁的方法吗?C++IF