a
まず、b
ローカル変数をリファクタリングします。
int TestTimeOut(unsigned long Timed_Val1, unsigned long Timed_Val2)
{
Timed_Val2 = Timed_Val1 + (Timed_Val2 * 200);
const int a = (Timed_Val1 > Timed_Val2) && (sys_msec < Timed_Val1) && (sys_msec > Timed_Val2);
const int b = (Timed_Val1 < Timed_Val2) && ((sys_msec < Timed_Val1) || (sys_msec > Timed_Val2));
return a || b;
}
今、これは興味深いです、Timed_Val2
に基づいていTimed_Val1
ます、それらは両方とも常にそうunsigned
です。最初は、これが真実であるとは思えませんでしたが、Mark Wilkins が指摘するように、それがラップアラウンドすれば、真実である可能性があります。Timed_Val2
>= Timed_Val1
a
ただし、それらが等しい場合は 1 つだけTimed_Val2==0
です。その場合は、読みやすくするために特別なケースとして抽出します。次に、2 つの>
/<
ステートメントを分解してif
.
int TestTimeOut(unsigned long Timed_Val1, unsigned long Timed_Val2)
{
if (Timed_Val2==0) return FALSE;
{
Timed_Val2 = Timed_Val1 + (Timed_Val2 * 200);
if (Timed_Val1 > Timed_Val2)
{ //this happens when it wraps around past 2^32
return (sys_msec < Timed_Val1) && (sys_msec > Timed_Val2);
}
else
{
return (sys_msec < Timed_Val1) || (sys_msec > Timed_Val2);
}
}
}
sys_msec
したがって、これは true if (if and only if) is beforeTimed_Val1
または afterを返すと言いますTimed_Val1 + Timed_Val2 * 0.2 seconds
。
最終段階として、変数の名前を変更してコメントします。
//Returns true iff time is before startTime_msec or after timeoutPeriods of 0.2 seconds
//startTime_msec - millisecond value compariable to sys_msec
//timeoutPeriods - the number of timeout periods of 0.2 seconds each
int TestTimeOut(const unsigned long startTime_msec, const unsigned long timeoutPeriods)
{
if (timeoutPeriods==0) return FALSE;
{
const unsigned long maxTime_msec = startTime_msec + (timeoutPeriods * 200);
if (startTime_msec > maxTime_msec)
{ //this happens when it wraps around past 2^32
return (sys_msec < startTime_msec) && (sys_msec > maxTime_msec);
}
else
{
return (sys_msec < startTime_msec) || (sys_msec > maxTime_msec);
}
}
}
これを行うためのより良い方法がないと言っているわけではありませんが、少なくとも現在は読みやすくなっています。