2012-04-12 16 views
2

Ich habe dieses Problem mit der zirkulären Abhängigkeit in C, ich sah mich um die anderen Fragen zu diesem Thema, aber wirklich konnte die Antwort nicht finden.C zirkuläre Abhängigkeit

Ich habe diese erste Struktur namens Vertex:

#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 

Die zweite Struktur der Kantenliste ist, die durch den Scheitelpunkt enthalten ist.

#ifndef edgelist_h 
#define edgelist_h 

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

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

//... 

#endif 

Und dann die letzte Struktur, die, wo das Problem löst, wird die Kante struct oben durch die Kantenliste enthalten.

#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 

Ich habe alles versucht ich konnte, nach vorn zu erklären, #ifndef, #define usw. verwenden, aber die Antwort nicht finden konnte.

Wie kann ich dieses zirkuläre Abhängigkeitsproblem lösen?

+0

In C11, können Sie typedefs überbrückte wiederholen. Sie könnten 'typedef struct edge edge;' - 'typedef struct Vertex Vertex;' - 'typedef struct Edgelisten Edgeliste;' in einen oder alle Header schreiben und dann einfach die Strukturtyp Information definieren (ohne das 'typedef' Präfix oder die Name am Ende) in der entsprechenden Kopfzeile: 'struct vertex {...};' - 'struct edge {...};' - 'struct Editierliste {...};'. Dies funktioniert jedoch nicht in C99 oder C90. Das Definieren von 'typedef' für denselben Namen ist ein Fehler in früheren Versionen von C. –

Antwort

8

Scheint so, als müssten Sie nichts in die Dateien einfügen. Eine Vorwärtsdeklaration der relevanten Arten sollte ausreichend sein:

#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 

usw. In C-Codierung, müssen Sie schreiben:

struct edgelist; 

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

Ich gehe davon eine Ecke muss wissen, was es Kanten verbinden , und eine Kante muss wissen, mit welchen Scheitelpunkten sie verbunden ist.

Wenn es nach mir ginge, würde ich separate Datentypen erstellen Ecken und Kanten zu assoziieren:

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; 
}; 

ich etwa 10-12 Stunden hinter auf dem Schlaf für die Woche laufen, so dass ich Ich bin mir ziemlich sicher, dass es eine bessere Möglichkeit gibt, die Mapping-Typen zu entwerfen (wahrscheinlich auf eine Art, die nicht mehr als einen Typ erfordert), aber das ist der allgemeine Ansatz, den ich wählen würde.

2

Diese Art der Abhängigkeit ist mit einer Forward-Deklaration gebrochen. Statt mit einer Datei mit der vollständigen Definition der Struktur gibt es zwei Alternativen:

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; 
+0

Beachten Sie, dass Symbole, die mit einem Unterstrich gefolgt von einem anderen Unterstrich oder einem Großbuchstaben beginnen, unbedingt für die Verwendung durch 'die Implementierung' reserviert sind. Vermeiden Sie im Allgemeinen das Erstellen von Namen, die mit einem Unterstrich beginnen. –

Verwandte Themen