我正在编写一个为AGE生成Barabasi-Albert图的函数,但在获取GRAPH_global_context
结构的任何变量时遇到了麻烦。我在src/backend/utils/graph_generation.c
上创建函数,同时也包含了"utils/age_global_graph.h"
。
我需要使用这个结构,因为一些函数可能有助于以更快和更可读的方式创建Barabasi-Albert图,并且它们使用GRAPH_global_context
作为参数,或者至少这个结构包含一个必须作为参数传递的列表或变量。在这种类型的图中,每个新边的添加位置取决于每个顶点上存在多少其他边,从而增加在它们上添加新边的概率。因此,类似下面的函数可以帮助找到哪个顶点具有最多的边。
ListGraphId *get_vertex_entry_edges_in(vertex_entry *ve);
ListGraphId *get_vertex_entry_edges_out(vertex_entry *ve);
ListGraphId *get_vertex_entry_edges_self(vertex_entry *ve);
我创建GRAPH_global_context如下:
/* The graph_name_str and graph_id are a pointer to char and an Oid. */
GRAPH_global_context* ggctx = manage_GRAPH_global_contexts(graph_name_str, graph_id);
但是当我试图获取ggctx
的vertices
列表的头部时,它显示一个错误:
GraphIdNode* current_node = get_list_head(ggctx->vertices);
^
// pointer to incomplete class type "struct GRAPH_global_context" is not allowed
1条答案
按热度按时间58wvjzkj1#
在
age_global_graph.h
中,我们有:这是
struct
的前向声明。这是一个不完整的类型。传递指针到它是完全可以的。
但是,从这个声明中,我们 * 不能 * 解引用这样的指针[因为我们实际上不知道里面是什么]。
我猜这是Apache试图使结构体成为一个“不透明”对象,我们只是传递[类型化]指针。
实际的
struct
定义在age_global_graph.c
中:因此,只有该文件中的函数可以实际使用/解引用这样的指针。
一些建议来补救这个…
1.最简单的方法是将定义从
age_global_graph.c
移动到age_global_graph.h
。但是,这有问题,因为只有.c
文件中有 * 更多 * 的struct
定义。所以,这可能是更多的麻烦比它的价值。1.将 * 您的 * 新代码放入
age_global_graph.c
并重新构建。这可以是直接复制和粘贴。这很简单,但很难维护,除非您有自己的git
分支。1.或者,你的新代码到(例如)
my_age_graph_code.c
并添加一行:#include "my_age_graph_code.c"
[或等同于age_global_graph.c