我有以下代码:
/* some calculation */
do {
/* data acquire and calculation */
} while (CONDITION);
我的状况如下:
(( A || B ) && C )
( A && C )
请注意,我将这些条件与A,B和C的不同语句一起使用。但是,预计算和循环内部的所有内容始终相同。我在代码中多次使用此块,并想知道是否有可能将它放在定义或函数中以使代码看起来更清晰。
使用不同的语句实现循环是否有一种合理的方法?
我已经考虑过像
这样的while循环中的函数调用while (DoMyLoop( CONDITION, calculationParams ));
但是通过这个解决方案,我不会在我的单行中进行预先计算。
我怎样才能将代码块放在一个漂亮的单行代码中(如果需要,可以更多,只要它易于理解和维护)?
一些额外的(可能无关的)信息:
在我的循环中,我收到一个字节数组,根据情况,我必须循环,直到特定位发生变化,因此A or B
。
C
是超时条件。
以下是一些带变量的代码
unsigned char data[10] = { 0 };
long intervalMS = 0;
/* precalc */
gettimeofday( &stopTimeout, NULL );
gettimeofday( &startTimeout, NULL );
do {
receiveCall( data );
gettimeofday( &stopTimeout, NULL );
intervalMS = (stopTimeout.tv_sec - startTimeout.tv_sec) * 1000 +
(stopTimeout.tv_usec - startTimeout.tv_usec) / 1000;
} while ( (data[0] & 0x01) && intervalMS < 200);
条件的A部分也可以看起来像((data[2] & 0x02) || data[3] == 0x12)
。
答案 0 :(得分:1)
下一个解决方案怎么样?
for (precalculation (); CONDITION; somethingWith (calculationParams));
precalculation ()
执行一次,CONDITION在每次迭代时进行评估,somethingWith (calculationParams)
取代增量。 for
循环的主体是空的。
Pure C beauty。
显然,预先计算和somethingWith(calculateParams)必须成为一个新函数。
答案 1 :(得分:0)
首先,请注意do {} while(something)
相当于something=true; while something{}
。如果您不想要初始化部分,前者可以节省一些额外的执行。
如何在一个漂亮的单行
中获取我的代码块
您的代码没有任何问题。 } while ( (data[0] & 0x01) && intervalMS < 200);
对我来说非常清楚 - 另一位C程序员。
检查lsb是否已设置并检查定时器间隔。这个代码可以改进的唯一方法是解释为什么你检查lsb - 你可以用注释做什么(你检查一个数字是奇数还是你在比特字段中读取了一些东西等)。
现在你可以而且应该做的是将整个片段放在一个函数中并给它一个有意义的名字。这是一个不错的单行。