【发布时间】:2015-09-09 09:26:05
【问题描述】:
我正在开发一个嵌入式系统,其中必须访问一个寄存器,然后递增以实现我正在寻找的结果,因为机器正在通知并配置为对我的访问和更改做出反应改变国旗。所以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块? -
@venki 防止,正如我在 OP 中所说,如果存在无法确保同步的状态,则会调用这些案例。
-
你知道
if块永远不会执行吗? -
在 Santosh 指点我之后我注意到了...我正在修复 sn-p,1 刻。
-
不要与
bool常量比较!这很难读。而是直接使用值作为条件(在这里,你必须否定):if ( !RunIndexSyncedWithADCensured )