2012-09-14 2 views
2

the answer to this question 에 의견을 추가하고 싶었지만 충분한 점수가 없었습니다. 다음 코드를 고려하십시오. errordesc에서 오류 설명을 어떻게 조회합니까? 내가 생각해 버전과이 문제를 볼 수 있습니다오류 설명에 오류 코드 매핑

/* add E_COUNT = 3 to enum _config_error */ 
const char *errorstring(error_t errnum) 
{ 
    unsigned int i; 

    for (i = 0; i < E_COUNT; ++i) { 
     if (errordesc[i].code == errnum) { 
      return errordesc[i].message; 
     } 

    } 

    return "Can't reach this point"; 
} 
  1. 하나 열거의 크기를 알고 수행하고 수동으로
  2. 하나는 루프에 대한 후 반환에 도달 할 수 E_COUNT 3으로 설정한다, 무엇을 할 것인가?
  3. 더 나은 솔루션이 있습니까?

답변

1
  1. 당신은 sizeof(errordesc)/sizeof(struct _errordesc)에서 E_COUNT을 계산할 수 있습니다.
  2. 루프의 끝 부분에 도달하면 "Unknown error" 또는 이와 유사한 것을 반환하십시오.
  3. 오류 코드가 연속적이지만 음수 인 것으로 보이므로 -errnum을 사용하여 배열에 직접 색인을 생성 할 수 있습니다.
+0

오류 코드는 연속입니다 ... 또한 C에서 bsearch()있다. 나는이 사실에 의존하지 않기를 바랄 것이다. –

+0

@MichaWiedenmann 그렇다면 현재 솔루션이 괜찮다고 생각합니다. 비록 1에서 제안 된대로 오류 코드의 수를 계산해야합니다. – rasmus

0

더 나은 옵션은 모든 오류 코드가 0부터 (또는 아래로) 연속적인 값을 갖도록하는 것입니다. 그런 다음 errordesc[]에 색인으로 사용할 수 있습니다. 물론, 그들이 음수라면 errordesc[-errnum]과 같은 것을 할 것입니다.

errordesc[]의 항목 수는 sizeof(errordesc)/sizeof(errordesc[0])입니다. 이를 전역 변수에 저장할 수 있습니다.

내가 원래 예에서 그들을 복사하기 때문에,

+1

오류 코드를'errordesc []'에 대한 색인으로 사용하면 수동으로 실수가 없다는 것을 추적해야합니다. 또한 오류 코드는 설명 옆에있는 것이 좋습니다. –