Re: GLIB Hash Data



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/



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]