C Embedded中错误处理的优化方式

时间:2011-09-01 14:13:39

标签: c optimization embedded

基本问题,但想知道这样做的优化方法。它是一个关闭例程的代码块,有多个进程关闭。在所有情况下,它应该尝试关闭所有进程和阶段,但保持失败值返回。

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,那么它返回一个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 个答案:

答案 0 :(得分: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语言编写,但你的代码片段看起来更像伪代码,所以我在这里解决它的问题。你需要编写适当的代码来附加错误代码列表。)

答案 1 :(得分:1)

如果你需要知道的是你的迭代是否失败,你可以使用++运算符:

int result = 0;

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

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