我想結合一個for回圈和while回圈,用戶可以選擇回圈直到它通過或回圈多次,如果沒有通過則回傳失敗:
uint8_t SomeFunc(uint32_t LoopCnt, unit32_t LoopForever)
{
uint8_t result = FAIL;
if(LoopForever != FALSE)LoopCnt = -1; /*max out LoopCnt if LoopForever is set*/
do{
for(i = 0; i < LoopCnt; i ){
result = Func();
if (result == PASS) break;
}
}while(LoopForever & (result == FAIL))/* do while loopforever is set and the result is fail */
return result;
}
有沒有更好的方法來寫這個?具有更好的性能和更少的代碼大小?它在 C 中。該解決方案可以不使用回圈來實作基本上任何你能想出的做同樣邏輯的東西。謝謝
uj5u.com熱心網友回復:
你真的“需要”結合whileandfor嗎?
uint8_t SomeFunc(uint32_t LoopCnt, uint32_t LoopForever) {
uint8_t result = FAIL;
while (result == FAIL && (LoopForever || LoopCnt--)) {
result = Func();
}
return result;
}
uj5u.com熱心網友回復:
候選替代假設result只能具有PASS或的值FAIL。
當LoopCnt == UINT32_MAX,i <= LoopCnt;永遠為真。
代碼使用<=test 而不是<. 我們簡單地需要測驗LoopCnt == 0case然后遞減LoopCnt。
uint8_t SomeFunc(uint32_t LoopCnt, unit32_t LoopForever) {
uint8_t result = FAIL;
if (LoopCnt > 0 || LoopForever != FALSE) {
LoopCnt--;
if (LoopForever != FALSE) {
LoopCnt = UINT32_MAX;
}
for (uint32t i = 0; i <= LoopCnt; i ){
result = Func();
if (result == PASS) {
return result; // Return now.
}
}
}
return result;
}
@Dave Meehan好的答案的優點是清晰,但每次迭代需要 3 次測驗。此代碼每個回圈有 2 次迭代。只有在特定情況下,例如 3% 的時間,較少的測驗才是可取的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/469132.html
上一篇:向子行程發送信號以更新值
下一篇:制作學校管理系統并出現錯誤
