当在graph_generation. c上使用GRAPH_global_context时,无法从其访问顶点指针

col17t5w  于 2023-05-06  发布在  其他
关注(0)|答案(1)|浏览(101)

我正在编写一个为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);

但是当我试图获取ggctxvertices列表的头部时,它显示一个错误:

GraphIdNode* current_node = get_list_head(ggctx->vertices);
                                          ^
// pointer to incomplete class type "struct GRAPH_global_context" is not allowed
58wvjzkj

58wvjzkj1#

age_global_graph.h中,我们有:

typedef struct GRAPH_global_context GRAPH_global_context;

这是struct的前向声明。
这是一个不完整的类型。传递指针到它是完全可以的。
但是,从这个声明中,我们 * 不能 * 解引用这样的指针[因为我们实际上不知道里面是什么]。
我猜这是Apache试图使结构体成为一个“不透明”对象,我们只是传递[类型化]指针。
实际的struct定义在age_global_graph.c中:

typedef struct GRAPH_global_context
{
    char *graph_name;              /* graph name */
    Oid graph_oid;                 /* graph oid for searching */
    HTAB *vertex_hashtable;        /* hashtable to hold vertex edge lists */
    HTAB *edge_hashtable;          /* hashtable to hold edge to vertex map */
    TransactionId xmin;            /* transaction ids for this graph */
    TransactionId xmax;
    CommandId curcid;              /* currentCommandId graph was created with */
    int64 num_loaded_vertices;     /* number of loaded vertices in this graph */
    int64 num_loaded_edges;        /* number of loaded edges in this graph */
    ListGraphId *vertices;         /* vertices for vertex hashtable cleanup */
    struct GRAPH_global_context *next; /* next graph */
} GRAPH_global_context;

因此,只有该文件中的函数可以实际使用/解引用这样的指针。
一些建议来补救这个…
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

相关问题