以下情况:
我的系统获取硬件信号并将时间值写入我的缓冲区 信号处理程序。然后发送(软件)信号,其中时间值作为相应插槽功能的参数。 插槽例程被正确调用,但我的问题在于:
在插槽函数中,我有一个简单的switch-case语句,如下所示:
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;
}
}
}
答案 0 :(得分:4)
您所描述的内容称为finite state machine,其中有大量优秀的状态机库可以为您解决繁重的问题。
查看this question以及它引用的其他一些内容。
答案 1 :(得分:2)
您可以尝试以下操作:
switch ((param - xy) >= 0 ? id : -id) {
// param >= xy cases
case 1:
...
break;
case 2:
...
break;
...
// param < xy cases
case -1:
...
break;
case -2:
...
break;
...
}
答案 2 :(得分:0)
或者对于一些有趣的事情,您可以编写一些自修改代码来动态更改您的swithc跳转表,因为它接收的参数不同。您必须为最大的表大小分配足够大的区域,并使用funciton指针或汇编程序,但它可以完成。
答案 3 :(得分:0)
尝试使用std::map
函数指针,a.k.a。跳转表,而不是switch
语句。该映射允许在运行时具有灵活性。
存储指向函数的指针以及案例值。在地图中搜索案例值,检索指针并取消引用以调用函数。