2013-02-09 1 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

Ну, 'return arr_error_message [err];'? – 2013-02-09 21:10:02

+0

@ H2CO3 он хочет код ошибки из сообщения об ошибке. –

+0

Извините за свою ошибку, мне нужно перевести с error_message на error_code – Michael

ответ

0

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

return arr_error_message[err]; 

С другой стороны, если вы хотите карту от ошибок сообщений к кодам ошибок, вы можете рассмотреть использование хеш-таблицы. Поскольку ваш набор кодов ошибок (вероятно) будет относительно постоянным, вы можете рассмотреть возможность использования gperf tool to generate a perfect hash table, что позволит очень быстро отображать сообщения об ошибках в кодах ошибок.

Надеюсь, это поможет!

+0

@ thang- Если существует фиксированный верхний предел длины строки (который в этом случае есть), они могут быть хэшированы в постоянное время, потому что мы можем немедленно отклонить любую строку дольше, чем самое длинное возможное сообщение об ошибке. идеальная хеш-таблица, поиск также требует постоянного времени, поэтому общая работа является постоянной. – templatetypedef

0

Если вы планировали получить строки ошибок из кода ошибки, достаточно простого массива для получения O (1) алгоритма.

Но так как вы хотите код ошибки из строки ошибки, лучше всего я знаю, что использовать хеш-таблицу для хранения и извлечения узла. Используйте gnu gperf.

0

Это просто умоляет быть структурой radix tree. C на самом деле не имеет строк, поэтому все сопоставления строк будут представлять собой циклы, сравнивающие одиночные символы. И строки - это все константы. Таким образом, вы можете также разбить строки на свои составные символы и вручную построить дерево из них, а затем пройти дерево по одному символу за раз.

Смежные вопросы