首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方法HASH_ADD不向哈希表添加新元素。使用uthash.h

方法HASH_ADD不向哈希表添加新元素。使用uthash.h
EN

Stack Overflow用户
提问于 2020-12-21 03:25:39
回答 1查看 129关注 0票数 1

基于找到的这里文档,我用C编写了以下代码:

adj_hash_table.h

代码语言:javascript
复制
typedef struct {
    int id_0;
    int id_1;
}id_t_;

typedef struct {
    id_t_ id;
    double value;
    UT_hash_handle hh;
}cell_t;

void add_(int id_0, int id_1, double value, cell_t *cells);
void free_table( cell_t *cells);
void main();

adj_hash_table.c

代码语言:javascript
复制
#include <stdio.h>
#include "uthash/src/uthash.h"
#include "adj_hash_table.h"

void add_(int id_0, int id_1, double value, cell_t *cells){

    cell_t l, *p;

    memset(&l, 0, sizeof(cell_t));
    l.id.id_0 = id_0;
    l.id.id_1 = id_1;
    HASH_FIND(hh, cells, &l.id, sizeof(id_t_), p); 

    if (p == NULL) {
        printf("Not found %d, %d\n", id_0, id_1);
        p = (cell_t *)malloc(sizeof *p);
        memset(p, 0, sizeof *p);
        p->id.id_0 = id_0;
        p->id.id_1 = id_1;
        HASH_ADD(hh, cells, id, sizeof(id_t_), p);
    }
    else
    {
        printf("Found %d, %d\n", id_0, id_1);
    }
    p->value = value;
}

void free_table( cell_t *cells){
    cell_t *p, *tmp;
    HASH_ITER(hh, cells, p, tmp) {
        HASH_DEL(cells, p);
        free(p);
    }
}

void main(){
    int nb_cells;
    cell_t *cells = NULL; 

    add_(0,0,1.0,cells);
    add_(0,1,2.0,cells);
    add_(0,0,3.0,cells);

    nb_cells=HASH_COUNT(cells);
    printf("number of cells: %d\n", nb_cells);

    free_table(cells);
}

当我使用:gcc -g -Wall -o adj_hash_table adj_hash_table.c编译它并在以后使用./adj_hash_table运行它时,我得到以下输出:

代码语言:javascript
复制
Not found 0, 0
Not found 0, 1
Not found 0, 0
number of cells: 0

但我希望:

代码语言:javascript
复制
Not found 0, 0
Not found 0, 1
Found 0, 0
number of cells: 2

这让我觉得HASH_ADD不起作用。这里的例子对我来说很好。我做错了什么?另外,我的free_table方法正确吗?谢谢!!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-21 04:03:06

来自引用文档的“将散列指针传递到函数”部分:

在上面的示例中,用户是一个全局变量,但是如果调用者想要将哈希指针传递到add_user函数中怎么办?乍一看,您似乎可以简单地将用户作为参数传递,但这是行不通的。 您确实需要传递一个指向散列指针的指针: 处理指向哈希指针的指针的原因很简单:散列宏修改它(换句话说,它们修改指针本身而不仅仅是它所指向的)。

也就是说,您需要将cell_t **传递给您的add_函数,而不是cell_t *,然后使用*cells调用HASH宏。

代码语言:javascript
复制
void add_(int id_0, int id_1, double value, cell_t **cells){
    ....
    HASH_FIND(hh, *cells, &l.id, sizeof(id_t_), p);
    ....
    HASH_ADD(hh, *cells, id, sizeof(id_t_), p);

电话将是:

代码语言:javascript
复制
cell_t *cells = NULL; 
add_(0,0,1.0,&cells);
add_(0,1,2.0,&cells);
add_(0,0,3.0,&cells);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65387206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档