函数中的切换大小写语句不会切换C++
Switch case statement in function doesn't switch C++
我正在尝试在两个不同的函数中使用两个开关大小写语句来通过串行包控制微控制器,但其中一个函数不切换,程序无限循环。其中一个功能根据enum
切换:
enum class State {
example_a,
example_b,
example_c
};
void serialTask(State stateArg, ObjectA exampleA, ObjectB exampleB, ObjectC exampleC, ObjectD exampleD) {
switch (stateArg) {
case State::example_a:
Serial.println("Serial Task, example a");
exampleA.doSomething();
stateArg = State::example_a;
break;
case State::example_b:
Serial.println("Serial Task, example b");
exampleB.doSomething();
stateArg = State::example_b;
break;
case State::example_c:
Serial.println("Serial Task, example c");
exampleC.doSomething();
stateArg = State::example_c;
break;
}
};
我将所有其他对象作为参数提供给它,因为根据情况,我调用它们的函数或修改它们的成员。
另一个功能根据串口切换enum
的值:
void stateSwitch(State stateArg) {
if (Serial.available()) {
uint8_t code = Serial.read();
switch (code) {
case 'a':
stateArg = State::example_a;
break;
case 'b':
stateArg = State::example_b;
break;
case 'c':
stateArg = State::example_c;
break;
}
};
他们后来在我的main.cpp
中被召唤,就像这样:
ObjectA aObj;
ObjectB bObj;
ObjectC cObj;
ObjectD dObj;
volatile State stateObj;
void setup(){
stateObj = State::example_a;
Serial.begin(115200);
};
void loop(){
stateSwitch(stateObj);
serialTask(stateObj, aObj, bObj, cObj, dObj);
};
这是问题的简化版本,但它说明了这一点。程序可以编译,但由于某种原因它无法跳出State::example_a
。我正在使用Teensy微控制器和PlatformIO中的Arduino框架,这是Visual Studio的扩展。谢谢你的帮助。
您正在按值将stateArg
传递给stateSwitch
。
这意味着正在制作副本,而您正在修改副本,而不是原始副本。
void serialTask(State stateArg, ...
stateArg = State::example_a; // affects local copy only
这是按值传递的,因此为函数创建副本。它不会将任何更改回显到原始变量。
为此,您需要通过引用传递它:
void serialTask(State &stateArg, ...
stateArg = State::example_a; // affects variable used in call
请注意,您需要在所有想要更改变量的函数中通过引用传递(因此stateSwitch
以及serialTask
(。
例如,请注意以下几点:
#include <iostream>
void procA(int num) {
num = 7;
}
void procB(int &num) {
num = 42;
}
int main() {
int num = 1; std::cout << num << 'n';
procA(num); std::cout << num << 'n';
procB(num); std::cout << num << 'n';
}
这将导致三行1
、1
和42
,因为对procA
的调用是按值传递的,这不会影响传递的变量,只影响它的本地副本。
另一方面,procB
,通过引用传递,确实会更改传递的变量。
另请注意,无论按值还是按引用传递,调用都是相似的。您无需以任何方式更改呼叫。
您可能还想检查这些事情背后的逻辑:
case State::example_a: // current state
Serial.println("Serial Task, example a");
exampleA.doSomething();
stateArg = State::example_a; // why set to same/original state?
break;
状态机强制状态恢复到执行事件之前的值是非常不寻常的。这可能没关系,因为我们看不到您的所有代码,但我只是在那里小心。
相关文章:
- 我的简单if-else语句是如何无法访问的代码
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 为什么是0;C++中的有效语句
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 是否可以使用if constexpr删除控制流语句
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 我似乎对if/else的基本语句有问题:/
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- If语句在c++中被忽略
- 比较if语句中的数组值和int值
- 以在Qt中的IF语句中设置时间延迟
- Craps游戏问题,忽略if语句
- "类模板示例<int>;"语句对 C++11 是什么意思?
- 如何编写一个使用n倍三元条件语句的C++布尔函数
- c++:定义if语句中的模板
- 主线的等价语句是什么