Bonjour,

Je me permet de cross-poster (forum de commentcamarche) car c'est assez urgent ...

Voila je veux programmer en c/c++ un intersecteur de polyedre en 3D. Je veut utiliser une structure de donnés de type "halfedge" (http://www.flipcode.com/archives/The...tructure.shtml) pour decrire mes polyedres.


Donc je veux me definir des types particulier mais le probleme, c'est que chacun de ces types utilise au moins un autre de ces nouveaux type donc le compilateur qui parcours le fichier dans l'ordre est perdu. En particulier, un champ de ma structure pour un de ces nouveau type est un pointeur vers ce type lui-meme!

Pour etre plus clair, voici le code de ce que je veut faire:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
typedef struct
{
   HEvert *vert;
   HEface *face;
   HEedge *twin;
   HEedge *next;    
} HEedge;
 
typedef struct
{
   double coor[3];
   HEedge *edge;
} HEvert;
 
typedef struct
{
   HEedge *edge;
} HEface;
 
typedef struct
{
   int nbfaces, nbedges, nbvertices;
   HEface *face;
   HEedge *edge;
   HEvert *vert;
} HEpoly;

J'ai essayé de creer à la place des classe avec à la place des (HEtruc *) des (void *) puis de caster en (HEtruc *) dans le constructeur:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
 
////////////////////////////////////////////////////////////////////////
// partial declaration (type of fields casted by constructors)        //
////////////////////////////////////////////////////////////////////////
 
class HEpoly
{
    public:
        // datas
        int nbfaces, nbedges, nbvertices;
        void *face;
        void *edge;
        void *vert;
 
        // methods
        HEpoly();
};
 
class HEface
{
    public:
        // datas
        void *edge;
 
        // methods
        HEface();
};
 
class HEedge
{
    public:
        // datas
        void *vert;
        void *face;
        void *twin;
        void *next;  
 
        // methods
        HEedge();  
};
 
class HEvert
{
    public:
        //datas
        double coor[3];
        void *edge;
 
        // methods
        HEvert();
};
 
 
////////////////////////////////////////////////////////////////////////
// constructor definitions                                            //
////////////////////////////////////////////////////////////////////////
HEpoly::HEpoly() {
    face=(HEface *)face;
    edge=(HEedge *)edge;
    vert=(HEvert *)vert;
}
 
 
HEface::HEface() {
    edge=(HEedge *)edge;
}
 
HEedge::HEedge() {
    vert=(HEvert *)vert;
    face=(HEface *)face;
    twin=(HEedge *)twin;
    next=(HEedge *)next;
}
 
HEvert::HEvert() {
    edge=(HEedge *)edge;
};

Cette declaration est ok mais je ne peut pas faire par exemple (pointer of type ‘void *’ used in arithmetic):

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
HEpoly poly1;
poly1.nbfaces=6;
poly1.face=(HEface *)malloc(poly1.nbedges*sizeof(HEface));
poly1.face[1]->edge=1;

Voilà, si quelqu'un à une idée.

Merci d'avance