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 には実際には文字列がないため、すべての文字列比較はいずれにせよ単一の文字を比較するループになります。文字列はすべて定数です。そのため、文字列を複合文字に分割し、それらからツリーを手作業で構築してから、一度に 1 文字ずつツリーをたどります。

于 2013-02-09T22:56:11.523 に答える