动态改变开关盒的尺寸

时间:2011-09-12 16:13:19

标签: c++ c

以下情况:

我的系统获取硬件信号并将时间值写入我的缓冲区 信号处理程序。然后发送(软件)信号,其中时间值作为相应插槽功能的参数。 插槽例程被正确调用,但我的问题在于:

在插槽函数中,我有一个简单的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;
        }
    }
}

4 个答案:

答案 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语句。该映射允许在运行时具有灵活性。

存储指向函数的指针以及案例值。在地图中搜索案例值,检索指针并取消引用以调用函数。