- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给出代码片段:
#include <glib.h>
#include <stdio.h>
void print_city(gpointer value, gpointer data)
{
printf("%s, ", value);
}
void print(gpointer key, gpointer value, gpointer data)
{
printf("Here are some cities in %s: ", key);
g_slist_foreach((GSList *)value, (GFunc)print_city, NULL);
printf("\n");
}
void destroy(gpointer key, gpointer value, gpointer data)
{
printf("Freeing a GSList, first item is %s\n", ((GSList*)value)->data);
g_slist_free(value);
}
int main(int argc, char *argv[])
{
GHashTable *hash = g_hash_table_new(g_str_hash, g_str_equal);
g_hash_table_insert(hash,
"Virginia",
g_slist_append(g_hash_table_lookup(hash, "Virginia"), "Richmond")
);
g_hash_table_insert(hash,
"Virginia",
g_slist_append(g_hash_table_lookup(hash, "Virginia"), "Keysville")
);
g_hash_table_insert(hash,
"Texas",
g_slist_append(g_hash_table_lookup(hash, "Texas"), "Houston")
);
g_hash_table_insert(hash,
"Texas",
g_slist_append(g_hash_table_lookup(hash, "Texas"), "Austin")
);
g_hash_table_foreach(hash, print, NULL);
g_hash_table_foreach(hash, destroy, NULL);
g_hash_table_destroy(hash);
return 0;
}
我们可以注意到 main
中的行调用 g_hash_table_insert
的函数,看起来有点复杂,重复本身,因此我正在寻找代码替代方案来简化值参数。考虑到这一点,我第一次尝试更改代码如下(已添加注释)
GSList *list = NULL;
// Adding the first element to `list`
// list contains the pointer to the GSList head
list = g_slist_append(list, "Austin");
// Inserting the list (an address to a GSLIST) into
// the value of "Texas" key.
g_hash_table_insert(hash, "Texas", list);
// Retrieves the content of "Texas" key.
// (That is right now the pointer to the GSList head)
// and stores into value pointer
list = g_hash_table_lookup(hash, "Texas");
// Add the string "Houston" to the GSList and stores
// the new head at `value` to keep track of head.
list = g_slist_append(list, "Houston");
// Updates the 'key' Texas with list.
g_hash_table_insert(hash, "Texas", list);
看起来并没有好多少。我还在代码中添加了一些注释来描述我的理解。
问题1:我的理解(在评论中表达)是否正确?
问题2:保持代码一致性,有没有办法改进上面的代码?
我注意到我可以删除对 g_hash_table_insert
的所有调用在第一个之后,可能会牺牲一些一致性。本例中的代码如下所示
GSList *list = NULL;
list = g_slist_append(list, "Austin");
g_hash_table_insert(hash, "Texas", list);
list = g_hash_table_lookup(hash, "Texas");
list = g_slist_append(list, "Houston");
问题 3:此更改如何影响一致性?
问题 4:此更改可能会出现哪些行为?
无论如何,考虑到前面的代码片段,我试图让事情变得更加“有组织”,因此我到达了以下代码片段来更新 GHashTable 中的列表:
GSList *list = NULL;
g_hash_table_insert(hash, "Texas", list);
list = g_hash_table_lookup(hash, "Texas");
list = g_slist_append(list, "Austin");
list = g_slist_append(list, "Houston");
上面的代码看起来更有条理,但在工作中完全失败(甚至在 free
调用上触发段错误)。我无法理解为什么最后一个片段失败了。
问题 5:为什么会发生段错误?
问题 6:是否有更简单的方法来处理 GSLists
在GHashTables
不使用初始构造?
最佳答案
GSList *list = NULL;
g_hash_table_insert(hash, "Texas", list);
list = g_hash_table_lookup(hash, "Texas");
list = g_slist_append(list, "Austin");
list = g_slist_append(list, "Houston");
这里你的哈希表只包含 NULL。即使前面的示例看起来很可疑,实际上也不能保证有效:只要您修改列表,头指针都可能会发生变化。
执行您想要的操作的最简单方法是首先构建列表,然后将其添加到哈希表中:
GSList *list = g_slist_append(NULL, "Austin");
list = g_slist_append(list, "Houston");
g_hash_table_insert(hash, "Texas", list);
但是任何时候你想要修改列表,你都必须将其重新插入到哈希表中...我建议重新考虑你的数据结构选择:链接列表并不是真正适合任何东西(并且 GLib 实现尤其如此)你发现很烦人)。 GSequence、GArray(甚至带有 g_hash_table_add() 的 GHashTable)可能是 GLib 中合适的替代方案。
关于c - 使用 GSList 作为 GHashTable 值的不同方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57920143/
我正在处理类似的事情,但是它会抛出错误。 我只是将数组放入一个变量中并以这种方式传递它,但我正在查看近 500 行,例如无模式数据的行。 (所以我不能使用循环) 此外,使用 GSList 的全部目的是
你好, 我正在尝试使用 glib.h 中的 GSList,但在用 char * 元素填充列表时遇到问题。 代码如下: GSList * res = NULL; char * nombre; while
我正在尝试创建一个迭代程序,使用 GSList 和 C 从特定的起始文件夹读取所有文件夹。目前我还没有找到代码中的缺陷。 我遇到的问题是它读取每个文件夹及其所有子文件夹,直到到达包含更多子文件夹的文件
将 GSList 传递给 Glib 宏(例如 G_OBJECT_TYPE_NAME()、GTK_IS_WIDGET() 等)会导致段错误。 这是一个问题,因为我的程序必须处理 GObjects 列表,
给出代码片段: #include #include void print_city(gpointer value, gpointer data) { printf("%s, ", valu
如何在 DBusInterface 中创建方法对于 purple_find_buddies ?具体来说,我必须指定什么作为返回类型而不是 GSList*? 最佳答案 看起来,它只是变成了 List -
我想放一个GSList在 GHashTable 里面,这是我管理所有这些的方式: #include #include typedef struct Foo_ { GHashTable * ba
我正在尝试使用函数 g_slist_append(list, &structure) 将结构添加到单向链表。这似乎可行(它正在添加指针),但是我似乎无法在读取链表时找到查看结构中元素的方法。 我的结构
我正在更新一些 1990 年代的 C 代码并将其转换为 C++。原始代码在很大程度上依赖于 Gnome's gslist (单链表)。我发现 gslist 很难集成到我的面向对象代码中,所以我真的很想
我是一名优秀的程序员,十分优秀!