c - 在每次迭代中工作 g_hash_table_foreach

标签 c glib

我希望遍历哈希表中的每个键值对。因此我使用了 g_hash_table_foreach() 函数(原型(prototype)如下所示)。对于每个键值对,它调用一个 void func 方法。

void g_hash_table_foreach(GHashTable *hash_table,GHFunc func,
                          gpointer user_data);

但是,我要求每次调用该函数时,该方法都返回一个值。

例如考虑以下代码:

void calculate(gpointer key, gpointer value, gpointer userdata)
{
    return calculateNumbers(key, value);
}

int total = 0;
g_hash_table_foreach(mymap, calculate, NULL);

我要求变量 total 存储 calculate() 函数接收到的每个返回值的总和。我发现很难用 g_hash_table_foreach 方法做到这一点。

我宁愿有一个 while 循环,在外部声明 total 变量,并在每对变量的每次迭代中增加它的值。但是,我认为 glib 不允许我一次考虑一个键值对。 (与具有下一个属性的 GList 不同)请问我该怎么做?

最佳答案

这就是 API 为您提供“用户指针”的原因。在那里传递您需要的任何数据,例如 total 变量的地址:

static void calculate(gpointer key, gpointer value, gpointer userdata)
{
    int *total = userdata;

    *total += calculateNumbers(key, value);
}

g_hash_table_foreach(mymap, calculate, &total);

glib 和 GTK+ API:s 非常擅长提供用户指针,这让我“被宠坏了”;每当看到涉及回调的 C API(强制程序员使用全局状态)时,我都会畏缩。并提示。并且,如果可能,修复它。

更新:此外,为了完整起见,您实际上可以在没有回调的情况下使用 GHashTable 的“迭代”API 执行此操作。

参见 g_hash_table_iter_init()g_hash_table_iter_next()职能。这些至少需要 glib 版本 2.16。

关于c - 在每次迭代中工作 g_hash_table_foreach,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15244851/

相关文章:

c++ - 排列之间的差异

c - 在c中使用glib的g_hash_table_insert时出现段错误

C++将长字符串传递给构造函数或setter

c - 在 C 语言中,为什么数组的地址等于它的值?

c - dup返回错误(linux下c编程)

c - 为什么编译器生成 4 字节负载而不是 1 字节负载,而更宽的负载可能会访问未映射的数据?

c - 使用 glib 和 gtk+ 通过 USB 控制 ftdi 设备

python - 如何从 Python 中的 GLib.GString 获取原始字节?

python - 没有 GTK 的 GDK 事件处理

arrays - 在c中使用堆栈对int数组进行排序