我的任务是创建一个包含节点和边缘的简单图形。 在我给出的头文件中,我无法修改
typedef struct Edge_s* Edge;
typedef struct Node_s* Node;
typedef struct Graph_s* Graph;
和我的graph.c
typedef struct{
size_t w;
struct Node_s* target;
}*Edge;
typedef struct{
size_t value;
Edge* edges;
size_t s;
}*Node;
typedef struct{
Node* nodes;
size_t n;
Edge* edges;
size_t e;
}*Graph;
Edge create_edge(Node t, size_t w){
Edge ret = malloc(sizeof(*ret));
ret->target = t;
ret->w = w;
return ret;
}
这会在编译时发出警告
warning: assignment from incompatible pointer type
我在这里感到困惑,我出错了什么,我该如何解决?该程序几乎正在工作,我得到一个奇怪的错误,我认为可能是因为这个。
答案 0 :(得分:6)
你的typedef定义很糟糕。我很惊讶它甚至编译。
您首先将typedef-name Edge
定义为
typedef struct Edge_s* Edge;
然后将其重新定义为
typedef struct{
size_t w;
struct Node_s* target;
}*Edge;
这两个定义以两种完全不相关的方式定义Edge
。 (如果第一组声明符合同一翻译单元中的第二组,我知道的所有C编译器都会立即报告错误。)
我会说你的第二个结构定义应该只是
struct Edge_s {
size_t w;
struct Node_s* target;
};
不要尝试重新定义现有的typedef-name。这在C中完全是非法的。
答案 1 :(得分:2)
问问自己ret-gt;目标指向的对象是什么类型,对象是什么类型的对象?它们是相同类型的物体吗?