2017-06-29 14 views
0

最近、リストやマップなどのGLibのタイプを使用していますが、面倒な問題が発生しました。GLib:値を正しく見つけることができないハッシュテーブル

BoneIdMap = g_hash_table_new(g_direct_hash, g_str_equal); 

私は、文字列のキーにいくつかのUINTを挿入し、それを試してみると、それは完璧に動作します:

char* string = alloq_calloc(&model->dynamic, strlen(aimesh->mBones[x]->mName.data) + 1, sizeof(char)); 
strcpy(string, aimesh->mBones[x]->mName. 
if(map_find(&model->BoneIdMap, string, &handle)) { 
    index = *handle; 
} else { 
    index = model->BoneIdMap.size; 
} 
map_insert(&model->BoneIdMap, &index, sizeof(uint), string); 

注意し

オフから、私のような私のハッシュテーブルを作成しました:私は静的配列を渡してみたので、ポインタが動的に割り振られているので、動作しません。(両方とも動作しないことが分かります)

その後、これらの単位を後で試してみますラインWN:

char* string = alloq_calloc(&model->dynamic, strlen(ainode->mName.data) + 1, sizeof(char)); 
strcpy(string, ainode->mName.data); 
/* Time to do some debugging */ 
if(map_find(&model->BoneIdMap, string, &handle)) { 

しかし、それは単に動作しませんが...私は配列にすべてのキーを取得しようとした:

uint len; 
char** arr = g_hash_table_get_keys_as_array(model->BoneIdMap.table, &len); 
for(int i = 0; i < len; ++i) { 
    if(arr[i]) printf("Key: %s\n", arr[i]); 
     if(!strcmp(arr[i], ainode->mName.data)) printf("Yes!\n"); 
} 
printf("----------------------------\n"); 

をし、それが動作します!!! (???)

Key: pelvis 
Key: toe.L 
Yes! 
Key: sheath 
Key: lamp 
---------------------------- 
Key: toe.R 
Key: shin.L 
Key: fingerstip.R 
Key: neck 
Key: thigh.R 
Key: fingers.L 
Key: shin.R 
Key: spine 
Key: lamp 
Key: head 
Key: fingerstip.L 
Key: thm_end.L 
Key: thm_end.R 
Key: tiptoe.L 
Yes! 
Key: upperarm.R 

は、私は上記の印刷機能以外にもすぐそこに静的な文字列を使用してキーを追加し、それを見つけようとした場合、それがうまくいくことに注意してください!あなたはg_direct_hashハッシュ関数を使用している

Public Attributes 
char data [MAXLEN] 
    String buffer. 
size_t length 
    Binary length of the string excluding the terminal 0. 

をお読みいただきありがとうございました...

+0

あなたの 'map_insert'と' map_find'コードは、両方ともGLibハッシュテーブル関数に関するラッパー関数であると仮定しているので、それらを共有してください。 – tgregory

答えて

1

- 私はかなり混乱したまま ...ところで

は、MNAMEはaiString(ASSIMP)でありますこれは文字列キーのgpointerに使用するためのもので、g_str_hashに変更してみてください。

// g_direct_hash implementation seems to be this 
guint 
g_direct_hash (gconstpointer v) 
{ 
    return GPOINTER_TO_UINT (v); 
} 

は、それが静的な文字列リテラルでは動作しない理由については、私はので、それが同じポインタをハッシュし、それはコンパイラのバイナリスペースを最適化し、単一のデータ・セグメント・レコードに等しい内容を持つ2つのリテラルを崩壊だと言うだろうなぜそれは正しく動作するように見えますが、正しく動作しません。

+0

しかし、私は文字列をハッシュしていません、私は文字列にuintをマップしようとしています。基本的にはキーとしての文字列、値としての整数 – Whiteclaws

+0

@Whiteclaws Hashtable(一般的なデータ構造のような)は次のように動作します。ほとんどの場合、ハッシュキーを置くと、hashはある範囲の整数値であり、この範囲はハッシュテーブルのバケット数であることが最も多いです。したがって、キーのルックアップが発生すると、最初に検索されたキーのハッシュが計算されます。その後、バケットを見つけて保存されたキーとルックアップキーを比較する必要があります(同じハッシュを生成する複数のキーがあるため)。そのため、ハッシュテーブルのコンストラクタはハッシュ関数と比較関数の両方を持っています。それで、両者はゼロ終端文字列で作業する方法を知る必要があります。 – tgregory

関連する問題