gpt4 book ai didi

C 代码给出不同的返回值,具体取决于 "puts("的使用情况..")

转载 作者:行者123 更新时间:2023-11-30 15:28:02 25 4
gpt4 key购买 nike

我正在做一些 C 编程,遇到了一个问题,我没有做过很多 C 编程,所以这可能是一些愚蠢的事情,请原谅。但我只是不明白为什么这个代码块会根据我是否执行行 //puts("is_in_group called"); 给出不同的输出。

GHashTable *is_in_group(GPtrArray *groups, char *city, int elements_in_groups){

//puts("is_in_group called"); If I uncomment this line, the function works, but otherwise it doesn't

GHashTable *temp_set = NULL;

for (int i = 0; i < elements_in_groups; i++){

temp_set = g_ptr_array_index(groups, i);
if(g_hash_table_contains(temp_set, city)){
printf("Found: %s\n",city );
return temp_set;

}
}
printf("City: %s not found\n", city);

return temp_set;
}

输出 //puts("is_in_group called");:

Added:
Wheeling
Sumter
----
is_in_group called
Found: Wheeling
is_in_group called
Found: Sumter

不带 puts("is_in_group called") 的输出;

Added:
Wheeling
Sumter
----
City: Wheeling not found
City: Sumter not found

如果我移动我的放置/打印,我可以获得其他输出组合,例如一个找到,一个没有。

这里有完整的代码,但我不希望有人看到它。整个 parser() 部分是 100% 所以没有任何问题。 http://pastebin.com/spcxMF76该函数的使用方法如下:

/*runs kruskal's algorithm on @param edges and stores
a minimal spanning tree in @param min_tree*/
void run_kruskal(Edge edges[], GPtrArray *result)
{
int elements_in_groups = 0;
GPtrArray *groups = g_ptr_array_new();

for (int i = 0; i < 1; i++)
{
char *city_a = edges[0].city_a;
char *city_b = edges[1000].city_b;


// Check if city A and B are already in a group
GHashTable *t1 = g_hash_table_new (NULL, compare_strings);
g_hash_table_add(t1, city_a);
g_ptr_array_add (groups, t1);
elements_in_groups++;
GHashTable *t2 = g_hash_table_new (NULL, compare_strings);
g_hash_table_add(t2, city_b);

g_ptr_array_add (groups, t2);

elements_in_groups++;
GHashTable *group_A = is_in_group(groups, city_a, elements_in_groups);

GHashTable *group_B = is_in_group(groups, city_b, elements_in_groups);


}




}

最佳答案

检查您的代码,我发现的一些问题可以解释您所看到的行为:

  1. parse 函数中复制字符串时没有分配足够的内存:

    temp_copy = malloc(sizeof(char) * strlen(temp1));
    strcpy(temp_copy, temp1);
    edges[index].city_a = temp_copy;

    您还需要为 '\0' 终止符分配内存:

    temp_copy = malloc(sizeof(char) * (strlen(temp1) + 1));

    顺便说一句,sizeof(char) 始终为 1(根据定义),因此无需明确提及。

  2. 您的 compare_edges 函数不符合 qsort 的要求。您没有涵盖两条边相等的情况:

    return e1 -> weight > e2->weight ? 1 : -1;

    这样的东西更好:

    return (e1->weight > e2->weight) ? 1 : ((e1->weight < e2->weight) ? -1 : 0);
  3. 当您在 run_kruskal 函数中创建哈希表(使用 g_hash_table_new )时,您没有指定哈希函数:

    GHashTable *t1 = g_hash_table_new (NULL, compare_strings);

    相反,请使用内置 g_str_hashg_str_equal字符串函数:

    GHashTable *t1 = g_hash_table_new (g_str_hash, g_str_equal);

代码中可能还潜藏着其他问题,但请先尝试修复这些问题,然后看看情况是否有所改善。

关于C 代码给出不同的返回值,具体取决于 "puts("的使用情况.."),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26739930/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com