开关箱尺寸动态变化
Dynamically changing size of switch-case
以下情况:
我的系统得到一个硬件信号,并将一个时间值写入到我的信号处理程序。之后,将一个(软件)信号以时间值作为参数发送给相应的槽函数。槽例程被正确调用,但这里我的问题在于:
在slot函数中,我有一个简单的切换语句,像这样:
switch(id) {
case 1:
do something..
id = 2;
break;
case 2:
start_time = val;
id = 3;
break;
case 3:
end_time = val;
id = 1;
break;
}
在这三种情况下,我在情况2和3之间存储了一个开始和结束时间值从这些时间值中,我确定硬件之间的运行时间信号。这很好,但现在我必须测量时间有时"更长",取决于参数。这意味着,我不能在情形3停止测量还有情形4 5 6等等。对于这个"问题",什么是优雅且最优的解决方案?而不是写:
if (param < xy) {
switch(id) {
case 1:
...
break;
case 2:
...
break;
} else if (param > xy) {
switch(id) {
case 1:
...;
break;
case 2:
...;
break;
case 3:
...;
break;
case 4:
...;
break;
case 5:
...;
break;
}
}
}
您所描述的被称为有限状态机,有大量优秀的状态机库可以为您处理繁重的工作。
看一下这个问题和它引用的其他一些问题
您可以尝试如下:
switch ((param - xy) >= 0 ? id : -id) {
// param >= xy cases
case 1:
...
break;
case 2:
...
break;
...
// param < xy cases
case -1:
...
break;
case -2:
...
break;
...
}
或者,您可以编写一些自我修改的代码,以便在接收到的参数不同时动态更改switch跳转表。您必须为最大的表大小分配足够大的区域,并使用函数指针或汇编器,但这是可以做到的。
尝试使用函数指针的std::map
,即跳转表,而不是switch
语句。该映射允许在运行时具有灵活性。
存储指向函数的指针以及case值。在映射中搜索case值,检索指针并解引用以调用函数。
相关文章:
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- C++中的动态铸造故障
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- C++取消引用指针.为什么会发生变化
- 为什么在读取文件大小时文件IO速度会发生变化
- 控制允许动态运行c++的并发操作数
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 输出没有重复元素的动态数组(收缩数组)C++
- 在调用解构之后,存储在内存中的动态分配值会发生什么变化
- 当在matlab mex文件中动态链接时,枚举的typeid会发生变化
- 动态规划:硬币变化
- 动态二维数组,列大小变化,不知道提前
- 硬币变化自下而上的动态规划
- STL push_back:在推送动态变化的数组时修改以前的值
- 开关箱尺寸动态变化
- (DirectX 11)动态顶点/索引缓冲区实现恒定的场景内容变化