3

我将编写一个将错误消息转换为错误代码的函数。所以我有一系列错误消息

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) 的函数?

4

3 回答 3

0

我认为这只是获得正确数据结构的问题。如果您希望能够从错误代码直接映射到字符串表示,您可以只返回存储在适当数组索引中的错误代码:

return arr_error_message[err];

另一方面,如果您想从错误消息映射到错误代码,您可以考虑使用哈希表。由于您的错误代码集(可能)将相对恒定,您可以考虑使用该gperf工具生成一个完美的哈希表,这样可以非常快速地将错误消息映射到错误代码。

希望这可以帮助!

于 2013-02-09T21:11:40.130 回答
0

如果您打算从错误代码中获取错误字符串,那么一个简单的数组就足以获得 O(1) 算法。

但是由于您想要错误字符串中的错误代码,所以我知道的最好的方法是使用哈希表来存储和检索节点。使用 gnu gperf。

于 2013-02-09T21:15:49.703 回答
0

这只是乞求一个基数树结构。C 并没有真正的字符串,所以所有的字符串比较无论如何都将是比较单个字符的循环。字符串都是常量。因此,您不妨将字符串拆分为它们的复合字符,并从中手动构建树,然后一次遍历树一个字符。

于 2013-02-09T22:56:11.523 回答