I'm afraid Mark is right: you need to g_strdup() your keys and values before you put them in the hash. It's the downside of C ... you have to do the storage management.
John Ruben I Safir wrote: >>Your example is useless. > > > The example is very simple. Take in data from STDIN and use it for hash > keys and values. I have to create a new pointer every time to do this > with the hash functions in glib. The only way I can think of doing this is > with mallac. The STDIN has to go into a defined buffer which will point > to the same emmory location every time. Even strcpy would be useless > in this case without mallocing new memory by hand every time. > > IF it sees it's a char * it should just take in the data. > > Ruben > > > > GLIB is doing exactly what you asked it to. > >>GLIB cannot possibly know, and would not want to know, the nature of >>your data. You give it a pointer. How does it know the length of the >>pointer? How does it know you are not passing it a structure, and >>intend to have it copy the structure recursively? >> >>If you need it to do strcpy(), pass the key and value through g_strdup() >>before storing. >> >>mark >> >> >>On Wed, Apr 24, 2002 at 06:28:22PM -0400, Ruben I Safir wrote: >> >>>I'm wondering how useful the hashing system can be ibn GLIB >>> >>>I tried this code, and it seems that instead of copying strings, it just copies the pointer value >>>resulting in making it impossible to look through input and assigning it to key values, unless I'm >>>doing something worng. This is just about useless >>> >>>#include <stdio.h> >>>#include <string.h> >>>#include <glib.h> >>> >>>GHashTable * hTable; >>> >>>guint HashFunction(gpointer key){ >>> char *sKey; >>> guint giHashValue = 0; >>> int nIndex; >>> >>> sKey = key; >>> if(key == NULL) return(0); >>> >>> for (nIndex = 0; nIndex < strlen(sKey); nIndex++){ >>> giHashValue = (giHashValue << 4) + (giHashValue ^(guint) sKey[nIndex]); >>> } >>> return (giHashValue); >>>} >>> >>>gint HashCompare( gpointer sName1, gpointer sName2){ >>> return (!strcmp((char *)sName1, (char *) sName2)); >>>} >>> >>>void print_hash(gpointer key, gpointer value, gpointer otherdata){ >>> g_print ("Key: %s ==> Value: %s\n", (gchar *) key, (gchar *) value); >>>} >>> >>>int main(int argc, char *argv[]){ >>> gchar buff_key[255]; >>> gchar buff_val[255]; >>> hTable = g_hash_table_new(HashFunction, HashCompare); >>> while(1){ >>> if(scanf("%255s", buff_key) < 1 ) break; >>> if(scanf("%255s", buff_val)< 1) break; >>> g_print("%s %s\n", buff_key, buff_val); >>> >>> g_hash_table_insert(hTable, buff_key, buff_val); >>> } >>> >>> >>> g_hash_table_foreach(hTable, (GHFunc) print_hash, NULL); >>> >>>exit(1); >>>} >>> >>> >>>ruben@www2:~/gtk > ./hash >>>One >>>Two >>>One Two >>>Three >>>Four >>>Three Four >>>Five >>>Six >>>Five Six >>><CTR d> >>>Key: Five ==> Value: Six >>>Key: Five ==> Value: Six >>>Key: Five ==> Value: Six >>> >>> >>>If it doesn't work like strcpy, it doesn't do much. ========================================================== Aelbert Cuyp 13 February - 12 May 2002 For information and tickets: http://www.nationalgallery.org.uk/exhibitions/cuyp/ _______________________________________________ gtk-list mailing list [EMAIL PROTECTED] http://mail.gnome.org/mailman/listinfo/gtk-list