6

Cの循環依存関係にこの問題があります。このトピックに関する他の質問を調べましたが、実際には答えが見つかりませんでした。

私は頂点という名前のこの最初の構造体を持っています:

#ifndef MapTest_vertex_h
#define MapTest_vertex_h

#include "edgelist.h" //includes edgelist because it's needed

typedef struct 
{
    char* name;
    float x, y;
    edgelist* edges;
} vertex;

#endif

2 番目の構造体は、頂点に含まれるエッジリストです。

#ifndef edgelist_h
#define edgelist_h

#include "edge.h" //include edge, because its needed

typedef struct _edgelist
{
    edge** edges; 
    int capacity, size;
} edgelist;

//...

#endif

そして、問題が発生する最後の構造体であるエッジ構造体は、上記のエッジリストに含まれます。

#ifndef MapTest_edge_h
#define MapTest_edge_h

#include "vertex.h" //needs to be included because it will be unkown otherwise

typedef struct 
{
    float weight;
    vertex* destination;
    int found; 
} edge;

#endif

前方宣言、使用など、できる限りのことを試みまし#ifndef#defineが、答えが見つかりませんでした。

この循環依存の問題を解決するにはどうすればよいですか?

4

3 に答える 3

12

どのファイルにも何も含める必要はないようです。関連する型の前方宣言で十分です。

#ifndef MapTest_vertex_h
#define MapTest_vertex_h

struct edgelist;

typedef struct
{
    char* name;
    float x, y;
    edgelist* edges;    // C++ only - not C
} vertex;

#endif

など。C コーディングでは、次のように記述する必要があります。

struct edgelist;

typedef struct
{
    char* name;
    float x, y;
    struct edgelist* edges;
} vertex;
于 2012-04-12T11:31:54.827 に答える
2

この種の依存関係は、前方宣言を使用して解消されます。構造体の完全な定義を含むファイルを含める代わりに、次の 2 つの方法があります。

1.

typedef struct 
{
    char* name;
    float x, y;
    struct _edgelist* edges; /* add "struct" here (elaborated type specifier) */
} vertex;

2.

struct __edgelist; /* better form: forward declaration */

typedef struct 
{
    char* name;
    float x, y;
    struct _edgelist* edges; /* still need to add "struct" here */
} vertex;
于 2012-04-12T11:52:00.937 に答える
1

私は、頂点がそれに接続するエッジを知る必要があり、エッジが接続する頂点を知る必要があると想定しています。

私なら、頂点とエッジを関連付けるために別のデータ型を作成します。

struct vertex {
  char *name;
  float x, y;
};

// edgelist as before

struct edge {
  float weight;
  int found;
};

// New struct to map edges and vertices

struct vertexEdge { // you can probably come up with a better name
  struct vertex *v;
  struct edgelist *edges;
};

// New struct to map vertices and edges

struct edgeVertext {
{
  struct edge *e;
  struct vertex *vertices;
};

私は 1 週間の睡眠時間が約 10 ~ 12 時間遅れているので、マッピング タイプを設計するためのより良い方法 (おそらく複数のタイプを必要としない方法) があると確信していますが、これは私が取る一般的なアプローチ。

于 2012-04-12T11:40:40.817 に答える