c - 这个 switch case 构造有更好的实现吗?

标签 c embedded

我在一个嵌入式系统上工作,其中必须访问一个寄存器,然后递增以获得我正在寻找的结果,因为机器正在通知并配置为对我的访问使用react并更改或不更改改变标志。所以 switch 的参数必须保持原样,否则它会改变嵌入式系统的行为。

但可能会出现我不想调用任何案例的情况。但我仍然需要访问和增加 switch 的参数。

(更深入我正在逐步将一系列模拟值转换为数字值转换。索引用于与当前转换保持同步并将其与相应的情况相关联以正确处理数字。可能会发生索引与当前转换不同步的状态,因此必须在不调用任何情况的情况下运行转换序列(以防止设置错误数据),直到序列完成并且可以执行重新同步)

我目前的做法是这样的:

switch (RunIndex++)/*RunIndex may only be accessed one time per execution
of this construct and has to be incremented in the same step. thats given.*/
{
   if (RunIndexSyncedWithADCensured == false)
   {
     break;
   }
   case 0:
     Case0RelatedData = SomeOperationsForCase0(RawData);
     break;
   case 1:
     Case1RelatedData = SomeOperationsForCase1(RawData);
     break;
   case 2:
     Case2RelatedData = SomeOperationsForCase2(RawData);
     break;
   default:
     RunIndex = 0;
     break;
}

这个构造完成了工作,但它看起来有点争议,考虑将其提交到产品代码中我感觉不太好。

那么有没有更好看的方法来实现相同的目标,而不需要额外的变量或赋值?

注意:

这也可能是相关的,它位于由两部分组成的中断函数的第一部分。 第一部分处理必须发生的事情 if() 转换完成。第二部分,有什么额外要做的 if() 这个转换也结束了序列。因此,不进入第二部分就简单地从函数返回是没有选择的。并且目前没有if(...)break; 可能会爆发的循环结构。 (这也是为什么我将 if 放在 switch 范围内的原因,因为它至少按照标准是一种有效的突破方式。)

最佳答案

首先,switch()中的if()永远不会被执行。
考虑以下代码片段:

#include <stdio.h>

int main(int argc, char *argv[])
{
    int i = 2;

    switch(i) {
        if (i == 2) {
            printf("I M HERE\n");
        }
        case 1:
            printf("1\n");
        break;
        case 2:
            printf("2\n");
        break;
        default:
            printf("default\n");
        break;
    }
    return 0;
}

对于您的代码:您希望打印字符串 I M HERE。但事实并非如此。
上述代码片段的输出是:

2

No statements before case/default(switch constructs): 在switch内部执行

现在回答

I don't want to get any of the cases get invoked. But I still need to acces and increment the argument of the switch

只需将 if() 移到 switch() 之外。

if (RunIndexSyncedWithADCensured) {
    switch (RunIndex++) {
        case 0:
            Case0RelatedData = SomeOperationsForCase0(RawData);
            break;
            /* Other cases here */
        default:
           RunIndex = 0;
           break;
    }
} else
    RunIndex++;

关于c - 这个 switch case 构造有更好的实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32475804/

相关文章:

c++ - 在 C++ 中拆分硬件相关类

assembly - ARM指令SWI和SVC完全相同吗?

c - 在 C 中打印出非均匀参数列表

C 字符串在循环中没有正确迭代

c - 如何在这段代码中实现定时器中断来计算这个斐波那契函数的秒数?

c - 读取文件并强制进程之间的操作顺序

c - 加载代码后 LED 不闪烁 Blackfin 处理器 F527

在 Sublime Text 2 (gcc) 中编译并运行 C

c++ - 可视化代码流的工具 (C/C++)

从函数返回值比较 C 中的宏