Problema al declarar estructuras recursivas

Started by Windgate, April 30, 2009, 12:52:47 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Windgate

Hola amigos, estoy programando un visor de modelos 3D básicos (Figuras geométricas básicamente) partiendo de las primitivas 2D de Bennu.

El problema es que al crear las estructuras de datos que requiero, el compilador no acepta que una estructura A tenga un puntero a una estructura B que también tiene un puntero a la estructura A. Me explico mejor con un ejemplo de código:

[code language="bennu"]TYPE _vertice
   int x,y,z;
   _poligono POINTER poligono;
END

TYPE _poligono
   _vertice POINTER vertices[16];
END[/code]

Mi estructura en cuestión es todavía más compleja, pero se entiende mejor con el código anterior. ¿Alguien sabe decirme cómo puedo hacer que algo así compile sin tener que modificar la estructura de datos? NECESITO que cada una de las estructuras mantenga un puntero a la otra.

Asias ;D
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Windgate

He conseguido hacer un "pequeño arreglo" para que funcione. Para ello he declarado uno de los POINTER sin indicar el tipo de dato al que quiero que apunte. En teoría con Bennu un puntero puede apuntar a cualquier cosa...

Adjunto el código final y compilando con este ovillo de punteros por si a alguien le resulta de utilidad:

[code language="bennu"]TYPE tp_3dfloat
   float x,y,z;
END

TYPE tp_color
   byte r,g,b;
END

TYPE tp_PolygonCell
    POINTER Vertices;      //No puede apuntar a tp_VertexListCell porque aún no está declarado
    tp_3dfloat Normal;
    bool Culled;
    tp_PolygonCell POINTER Rest;
END

TYPE tp_PolygonListCell
    tp_PolygonCell POINTER Polygon;
    tp_PolygonListCell POINTER Rest;
END

TYPE tp_VertexCell
    tp_3dfloat LocalPosition;
    tp_3dfloat WorldPosition;
    tp_3dfloat ScreenPosition;
    tp_3dfloat Normal;
    tp_PolygonListCell POINTER Polygons;
    tp_VertexCell POINTER Rest;
END

TYPE tp_VertexListCell
    tp_VertexCell POINTER Vertex;
    tp_VertexListCell POINTER Rest;
END

TYPE tp_SurfaceCell
    int NoofPolygons;
    tp_PolygonCell POINTER PolygonHead;
    tp_SurfaceCell POINTER Rest;
END

TYPE tp_ObjectCell
   string Name;
    int Number;
    int NoofVertices;
    int NoofSurfaces;
    tp_SurfaceCell POINTER SurfaceHead;
    tp_VertexCell POINTER VertexHead;
    string Transfor[3][3];
    tp_ObjectCell POINTER Rest;
END

TYPE tp_ViewPointRec
   int view_plane_dist;
   int rho, theta, phi;
END[/code]
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es