开关箱尺寸动态变化

Dynamically changing size of switch-case

本文关键字:变化 动态 开关箱      更新时间:2023-10-16

以下情况:

我的系统得到一个硬件信号,并将一个时间值写入到我的信号处理程序。之后,将一个(软件)信号以时间值作为参数发送给相应的槽函数。槽例程被正确调用,但这里我的问题在于:

在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值,检索指针并解引用以调用函数。