2013-02-09 98 views
3

我打算寫這應該翻譯錯誤消息錯誤代碼的功能。 所以我有錯誤訊息與錯誤代碼關聯的錯誤文本用C

const char *arr_error_message[] = 
{ 
    "Critical error", 
    "Unexpected error", 
    ... 
} 

和錯誤代碼枚舉數組:

typedef enum error_code 
{ 
    FIRST = 0, 
    CRITICAL_ERROR = FIRST, 
    UNEXPECTER_ERROR, 
    ... 
    LAST, 
    NOT_FOUND_ERROR 
} error_code_t; 

和功能將

error_code_t translate_error_code(const char *err) 
{ 
error_code_t e = FIRST; 
do 
{ 
     if (strcmp(arr_error_message[e], err) == 0) return e; 
} while (++e != LAST); 

return NOT_FOUND_ERROR; 
} 

的功能是什麼的更有效的方法實現,是否有任何方法(技巧)來實現複雜度爲O(1)的函數?

+1

嘛,'回報arr_error_message [ERR]'? – 2013-02-09 21:10:02

+0

@ H2CO3他想要錯誤信息中的錯誤代碼。 – 2013-02-09 21:16:59

+0

對不起,我的錯,我需要從ERROR_MESSAGE轉化爲ERROR_CODE – Michael 2013-02-09 21:17:46

回答

0

我認爲這僅僅是找到合適的數據結構的問題。如果您希望能夠從錯誤代碼直接映射到字符串表示,你可以返回存儲在適當的數組索引錯誤代碼:

return arr_error_message[err]; 

在另一方面,如果你想從錯誤圖譜消息到錯誤代碼,你可以考慮使用一個哈希表。由於您的一組錯誤代碼(可能)會相對穩定,因此您可以考慮使用gperf tool to generate a perfect hash table,這可以非常快速地將錯誤消息映射到錯誤代碼。

希望這會有所幫助!

+0

@ thang-如果有固定的上限,以字符串的長度(其中有,在這種情況下),它們可以在一定的時間散列,因爲我們可以立即拒絕任何字符串比最長可能的錯誤消息更長..給定完美的哈希表,查找也需要不斷的時間,所以整體工作是一個常量。 – templatetypedef 2013-02-09 22:20:36

0

如果您正計劃向錯誤代碼得到錯誤串,簡單的陣列就足以獲得O(1)算法。

但因爲你從錯誤字符串希望錯誤代碼,我知道最好的方法是使用一個哈希表來存儲和檢索的節點。使用gnu gperf。

0

這只是乞求是radix tree結構。 C沒有真正的字符串,所以所有的字符串比較都是循環比較單個字符。這些字符串都是常量。所以你不妨將弦分成複合字符並用它們手工構造樹,然後一次一個樹地走樹。