2

我的任务是创建一个既有节点又有边的简单图。在我给定且无法修改的头文件中,我有

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

我在这里有点困惑,我做错了什么,我应该如何解决?该程序几乎可以运行,我遇到了一个奇怪的错误,我认为这可能是由于这个原因。

4

2 回答 2

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 中简直是非法的。

于 2012-06-26T23:21:34.843 回答
2

问问自己 ret->target 指向什么类型的对象,它是什么类型的对象?它们是相同类型的对象吗?

于 2012-06-26T23:15:12.900 回答