Оптимизированный способ обработки ошибок в C Embedded - PullRequest
0 голосов
/ 01 сентября 2011

Основной вопрос, но хотелось бы узнать, как оптимизировать его выполнение. Это блок кода для закрытой подпрограммы, закрывающей несколько процессов. Во всех случаях следует попытаться закрыть все процессы и этапы, но сохранить значение сбоев для возврата обратно.

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 ]

2 голосов
/ 01 сентября 2011

Вам необходимо динамически выделять место для каждого кода ошибки в связанном списке или массиве, а затем передавать список обратно тому, что необходимо знать о результатах.

Вы можете либо иметь код для каждого закрываемого процесса и включать в него случаи «ОК», либо вы можете включить идентификатор процесса и код ошибки вместе и включать их только при наличии ошибки.

Например:

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 голос
/ 02 сентября 2011

Если все, что вам нужно знать, это то, что любая из ваших итераций не удалась, вы можете использовать оператор ++:

int result = 0;

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

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