2010-03-23 115 views
1

我不知道如何使用GTree(來自GLib)來存儲數據?使用g_tree_insert例程插入GTree的每個新值都會覆蓋前一個值!g_tree_insert覆蓋所有數據

GTree *tree; //init 
tree = g_tree_new(g_str_equal); //"g_str_equal" is a GLib default compare func 
//... 
for(i = 0; i < 100; ++i) 
    g_tree_insert(tree, random_key(), random_value()); //insert some random vals 
// 
printf("%d", g_tree_nnodes(tree)); //should be 100? NO! Prints "1"!!! 

我在做什麼錯了?謝謝。

回答

1

這是因爲平等與比較不一樣,所以g_tree_new需要一個函數,它給出兩個鍵(即字典順序)的順序,而不僅僅是它們是否相等。

+0

是的,我已經自己發現了,但是謝謝!以「正確的答案」:) – pechenie 2010-03-23 06:40:22

+0

非常真實,很好的工作 - 我只是希望它對人們更有意義,而不是「說出這些神奇的話」 – 2010-03-24 03:24:06

0

我想我找到了解決方案。問題是在:

tree = g_tree_new(g_str_equal); 

官方教程說,這是默認GCompareFunc的的一個,所以我決定用它(順便說一下,我successfuly在GHashTable沒有問題,使用它)。但這是麻煩。正確的初始化是:

tree = g_tree_new((GCompareFunc)g_ascii_strcasecmp); 

瞧!有用! Thanx到IBM教程。

+0

我錯了。 「g_str_equal」是GEqualFunc,但我需要GCompareFunc,所以出現錯誤。感謝所有人,我希望它能幫助別人! – pechenie 2010-03-23 06:14:45