2010-03-23 118 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