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

私はここでちょっと混乱しています、私は何が間違っているのですか、そしてどのようにそれを修正する必要がありますか?プログラムはほぼ機能しており、これが原因であると思われる奇妙なバグが1つ発生しています。

4

2 に答える 2

6

typedef-definitionsがひどく混同されています。コンパイルすら驚いています。

最初にtypedef-nameEdgeを次のように定義しました

typedef struct Edge_s* Edge;

その後、次のように再定義しました

typedef struct{
  size_t w;
  struct Node_s* target;
}*Edge;

これらの2つの定義はEdge、まったく関係のない2つの方法で定義されます。(私が知っているすべてのCコンパイラーは、宣言の最初のグループが同じ変換単位の2番目のグループと一致する場合、すぐにエラーを報告します。)

2番目の構造体の定義は単純にすべきだと思います

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 に答える