g_tree_insert écrase toutes les données
-
21-09-2019 - |
Question
Je me demande comment je devrais utiliser le GTree (de GLib) pour stocker des données? Chaque nouvelle valeur insérer dans GTree avec la routine de g_tree_insert est écrasera l'ancienne!
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"!!!
Qu'est-ce que je fais mal? Merci.
La solution
C'est parce que l'égalité n'est pas la même que la comparaison, g_tree_new
a besoin d'une fonction qui vous donne la pour de deux touches (à savoir de l'ordre du dictionnaire), non seulement si elles sont égales ou non.
Autres conseils
Je pense avoir trouvé une solution. Le problème était dans le:
tree = g_tree_new( g_str_equal );
Le tutoriel officiel a dit qu'il est l'un des défaut des années GCompareFunc, alors j'ai décidé de l'utiliser (en passant, je l'utilise avec succès dans le GHashTable sans problème). Mais il est la peine. L'initialisation correcte est:
tree = g_tree_new((GCompareFunc)g_ascii_strcasecmp);
Et le tour est joué! Ça marche! Thanx à des tutoriels IBM.