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

Reply via email to