2011-09-01 35 views
0

基本問題,但想知道最佳化的方法。它是一個關閉例程的代碼塊,有多個進程關閉。在所有的情況下,它應該嘗試關閉所有的流程和階段,但是保持失敗值返回。C嵌入式中的錯誤處理的優化方式

Error_code result=PASS; 
<some code> 
for i 1 to 10 
if((result = operation())!=PASS) 
    PRINT "FAILURE" 
done  
if((result = operation())!=PASS) 
    PRINT "FAILURE" 
for i 1 to 10 
if((result = operation())!=PASS) 
    PRINT "FAILURE" 
done  

return result; 

現在的問題是,如果最後一次迭代的通行證,那麼它返回一個PASS,由於操作應該運行的所有10次迭代,並在發生故障的情況下,它只是我們需要返回錯誤碼。因爲它幾乎可以有100個故障,我寫了這樣的代碼: -

Error_code result=PASS; 
Error_code tresult=PASS; 
for i 1 to 10 
if((result = operation())!=PASS) { 
    tresult = result; 
    PRINT "FAILURE" 
} 
if((result = operation())!=PASS) { 
    tresult = result; 
    PRINT "FAILURE" 
} 
for i 1 to 10 
if((result = operation())!=PASS) 
    tresult = result; 
    PRINT "FAILURE" 
done  

if(tresult != result) 
result = tresult; 

return result; 

是它的唯一優化的解決方案,或者我們可以做這更好。我無法使用標誌,因爲它有超過100個錯誤變量。 建議任何更好的方法..

回答

2

您需要動態分配鏈接列表或數組中的每個錯誤代碼的空間,然後將列表傳回無論需要知道結果。

您可以爲每個正在關閉的進程設置一個代碼,並在其中包含「OK」個案,或者可以將進程ID和錯誤代碼包括在一起,並且只有在出現錯誤時才包含它們。

例如:

errorList = NULL; 
for i 1 to 10 
if((result = operation())!=PASS) { 
    appendToList(errorList, i, result) 
} 
if(errorList != NULL) { 
result = ERROR; 
} else { 
result = PASS; 
} 
return result; 

(注:雖然你說你在寫C,您的代碼段看起來更像是僞代碼,所以這就是我在這裏解決它你」 d需要編寫適當的代碼以將錯誤代碼附加到列表中)。

1

如果你需要知道的是你的任何迭代是否失敗,你可以使用++操作:

int result = 0; 

for i 1 to 10 
if(operation() != PASS) 
    PRINT "FAILURE" 
    result++; 
done  

return (result == 0 ? PASS : ERROR);