Glib哈希表 - 密钥不存在

时间:2014-03-23 17:23:35

标签: c hashtable glib

我正在开发一个使用Glib哈希表的程序。程序启动时,它会读取一个文件,并根据这些数据填充哈希表。程序运行时,用户提供数据,代码检查密钥是否存在 - 如果是,则更新值,如果没有,则插入新密钥。

以下是样本:

    // fill hash with data's
    datastore = g_hash_table_new(g_str_hash, g_str_equal);
    while (fgets(inputbuffer, 90, fp) != NULL) {
        parse_utypeline(inputbuffer, udatakey, &udataidx);  // parse line, store fields in udatakey and udataidx
        utype_inc(udatakey, udataidx);  // push to hash
        total++;
    }


    // another part of code, find value of key
    nrofutype = utype_get(utypereclist.udatakey, udatainx);

// implemented functions
int utype_inc(char udatakey[15], int udata) {

    t_utype_rec_udatas *utype_rec_udatas;
    int i;
    gboolean gb;
    GList * hkeys = NULL;
    int gi;

    syslog(LOG_DEBUG, "utype store: %p", datastore);
    gb = g_hash_table_contains(datastore, udatakey);

    if (gb == 0) {
        utype_rec_udatas = g_malloc0(sizeof *utype_rec_udatas);
        for(i=0; i<10; i++) {
            /*
             * every item has derived like this:
             * typedef unsigned char t_utype_rec_udatas[10];
             * t_utype_rec_udatas *utype_rec_udatas;
             */
            (*utype_rec_udatas)[i] = 0;
        }
        g_hash_table_insert(datastore, udatakey, utype_rec_udatas);
    }
    else {
        utype_rec_udatas = g_hash_table_lookup(datastore, udatakey);
    }
    (*utype_rec_udatas)[udata]++;

    gb = g_hash_table_contains(datastore, udatakey);
    if (gb == 0) {
        return -1;
    }
    else {
        utype_rec_udatas = g_hash_table_lookup(datastore, udatakey);
        return (*utype_rec_udatas)[udata];
    }

}

int utype_get(char udatakey[15], int udata) {
    t_utype_rec_udatas *utype_rec_udatas;
    gboolean gb;

    if (datastore == NULL) {
        syslog(LOG_DEBUG, "store doesn't exists");
        return -1;
    }

    gb = g_hash_table_contains(datastore, udatakey);
    if (gb == 0) {
        return -1;
    }
    else {
        utype_rec_udatas = g_hash_table_lookup(datastore, udatakey);
        return (*utype_rec_udatas)[udata];
    }
}

问题是如果代码在后面的部分调用utype_get(),则密钥不存在(存在,确定)。如果我放入syslog行,并尝试捕获一些数据,我发现哈希表地址每次都是相同的。如果utype_inc()函数记录了udatakey,那么它在syslog中是正确的(我已经从g_hash_table_get_keys(datastore);记录了数据)。但是如果调用了utype_get(),g_hash_table_get_keys(datastore);会从相同的商店中提供一些非常明显的信息!这是系统日志行:

Mar 23 18:13:09 basil myprog: udata store: 0x2371400
Mar 23 18:13:09 basil myprog: new udatakey: 'ABCD', udataidx: 0
Mar 23 18:13:09 basil myprog: store value: 1
Mar 23 18:13:09 basil myprog: 0. key: 'ABCD'
Mar 23 18:13:09 basil myprog: size of hash: 1

Mar 23 18:13:13 basil myprog: udata_get - udatakey: '', udataidx: 0
Mar 23 18:13:13 basil myprog: udata_get - size of hash: 1
Mar 23 18:13:13 basil myprog: udata_get - 0. key: '#020#001'
Mar 23 18:13:13 basil myprog: udata_get - udatakey doesn't exists in store: 0x2371400

我不知道,#020#001是什么(我知道,这可能是一个空格,还有一个0x01),但为什么呢?

欢迎任何帮助,

感谢:

一个。

1 个答案:

答案 0 :(得分:0)

解决方案是:

char datakeys[BIGNR][15];

// implemented functions
int utype_inc(char udatakey[15], int udata) {
...
    gb = g_hash_table_contains(datastore, udatakey);

    if (gb == 0) {
        utype_rec_udatas = g_malloc0(sizeof *utype_rec_udatas);
        for(i=0; i<10; i++) {
            /*
             * every item has derived like this:
             * typedef unsigned char t_utype_rec_udatas[10];
             * t_utype_rec_udatas *utype_rec_udatas;
             */
            (*utype_rec_udatas)[i] = 0;
        }
        gi = g_hash_table_size(datastore_store);
        strncpy(datakeys[gi], udatakey, strlen(udatakey));
        g_hash_table_insert(datastore, datakeys[gi], utype_rec_udatas);
    }
...
...

感谢您的帮助,

一个。