C dépendance circulaire
J'ai ce problème avec dépendance circulaire dans C, je regarda autour de lui d'autres questions sur ce sujet, mais ne pouvais vraiment pas trouver la réponse.
J'ai cette première struct nommé 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
La deuxième structure est la edgelist qui est inclus par le sommet.
#ifndef edgelist_h
#define edgelist_h
#include "edge.h" //include edge, because its needed
typedef struct _edgelist
{
edge** edges;
int capacity, size;
} edgelist;
//...
#endif
Et puis, le dernier struct, celle où le problème soulève, le bord struct est inclus par le edgelist ci-dessus.
#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
J'ai essayé tout ce que je pouvais, avant de déclarer, à l'aide de #ifndef
, #define
etc. mais je ne pouvais pas trouver la réponse.
Comment puis-je résoudre cette circulaire problème de dépendance?
- En C11, vous pouvez répéter les typedefs sans danger. Vous pouvez écrire
typedef struct edge edge;
—typedef struct vertex vertex;
—typedef struct edgelist edgelist;
dans toutes les têtes, et puis il suffit de définir le type de structure de l'information (sans letypedef
préfixe ou le nom à la fin) dans l'en-tête:struct vertex { … };
—struct edge { … };
—struct edgelist { … };
. Cela ne fonctionne pas dans C99 ou C90, cependant; la définition d'untypedef
pour le même nom est une erreur dans les versions antérieures de C.
Vous devez vous connecter pour publier un commentaire.
Semble que vous ne devriez pas besoin de l'inclure dans les fichiers. Une déclaration anticipée des types pertinents devraient être suffisants:
etc. Dans C de codage, vous devez écrire:
Ce type de dépendance est brisé à l'aide d'un avant la déclaration de. Au lieu d'inclure un fichier avec la définition complète de la structure, il y a deux alternatives:
1.
2.
Je suis en supposant un sommet besoin de savoir ce que les bords se connecter à elle, et un bord a besoin de savoir ce que les sommets il se connecte.
Si ça ne tenait qu'à moi, j'aimerais créer des types de données pour associer les sommets et arêtes:
Je suis en cours d'exécution d'environ 10-12 heures de retard sur le sommeil de la semaine, donc je suis assez sûr qu'il y a une meilleure manière de la conception de la cartographie des types (probablement dans un sens qui ne nécessitent pas plus d'un type), mais c'est l'approche générale que je.