Re: GLIB Hash Data
- From: John Cupitt ng-london org uk
- To: ruben mrbrklyn com
- Cc: mark mark mielke cc, gtk-list gnome org
- Subject: Re: GLIB Hash Data
- Date: Thu, 25 Apr 2002 11:57:43 +0100
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]