目前在正在作一个有关DXF的项目,其中涉及到读出图形文件的图元储存的问题,在dxf中不同类型的图元的描述参数的数量和类型完全是不一样的,为了能将所有的图元能储存在一起,
我设计了多个结构体,每种结构体描述一种图元。如:
//1、直线
typedef struct _dxfLine
{
   struct _dxfVertex *pVertexList;//节点的集合链表
   double thick;//厚度,可正可负数
} DXFLINEPARAM,  *PDXFLINEPARAM;//2、圆
typedef struct _dxfCircel
{
   struct _dxfVertex pVertexList;//圆心坐标,一个点就可以了
   double radius;//半径
   double thick;//厚度,可正可负数
} DXFCIRCELPARAM,*PDXFCIRCELPARAM;
...等等我设计一个结构链表,链表中设计有个void的指针(*pParam),我希望这个指针能分别储存上述结构的元素的。在不同的图元类型,就储存有不同的
typedef struct _dxfEntity2
{
GLenum glMode;//GL作图模式
COLORREF color; //图元颜色
long count;//参数个数,如果是直线就是2,当需要多个参数的描述如多段线的时候
void *pParam;//参数指针,因为参数的不确定,所以使用无值型指针
long number;//图元的编号,对于12以前的版本是没有这个信息的.
struct _dxfEntity2 *pNextEntity;//下一个实体指针
}DXFENTITY2, *PDXFENTITY2;
通过对链表元素就对应于一个图元的信息,中间的pParam,就是具体存放图元参数的。问题是将void指针赋值成图元参数指针后后怎么能再获得信息?PDXFENTITY2  m_lpCurrEntity2;//链表对象
PDXFCIRCELPARAM param=new DXFCIRCELPARAM;//图元对象
....//读取文件中的图元信息
m_lpCurrEntity2->pParam=param;怎么将m_lpCurrEntity2中保存在pParam的参数获得,
好像直接使用"->"编译的时候会报错误,如:
m_lpCurrEntity2->pParam->thick;///获得图元的厚度
错误说"thick必须指向一个类/结构/联合"不知道怎么解决

解决方案 »

  1.   

    是关于数据结构的问题,一般可用CArray和CList类及其相关类来解决。
      

  2.   

    m_lpCurrEntity2->pParam->thick;///获得图元的厚度
    错误说"thick必须指向一个类/结构/联合"
    这个当然会出错了~~~
    m_lpCurrEntity2->pParam为void *~~
    而thick所对应的应该是struct _dxfLine类型,这个
    m_lpCurrEntity2->pNextEntity->thick应该没有问题~~~
      

  3.   

    楼主的文章好长,看的好累.我想需要使用参数的时候这样实现:PDXFCIRCELPARAM param=new DXFCIRCELPARAM
    param=(PDXFTEXTPARAM )m_lpCurrEntity2->pParam;
    param->thick;
    ....
      

  4.   

    真是的,看得好累,反正有一点就是你要类型强制转换
    如:
    DXFCIRCELPARAM cir;
    DXFCIRCELPARAM *p_cir;
    LPVOID lpCir;
    lpCir = cir;
    p_cir = (PDXFCIRCELPARAM)lpCir;
    其实void挺好用的
      

  5.   

    将void指针强制转换成你要用的类型
      

  6.   

    可能我没有讲述清楚,我再简单讲下:1、我定义一个结构体 structure用于存放dxf中的绘图信息,其中定义了一个void的指针param,
    typedef struct _dxfstructure
    {
              ...
    long count
    void *pParam;
    struct _dxfEntity2 *pNextEntity;//下一个图元
             ....
    }structure 2、采用void指针的目的是因为dxf的图元参数的是不一样的,如:直线需要两点描述,而园需要一个圆心和半径来描述,因此用不同类型的结构描述不同的图元参数;
    参数部分有多个结构组成
    如园参数:
    typedef struct _dxfCircel
    {
    ...
    struct _dxfVertex ;//圆心点坐标
    double radius;//半径
    ...
    } circle_struc;直线参数
    typedef struct _dxfLine
    {
    ...
    struct _dxfVertex ,_dxfVertex;//直线的两个端点坐标
    ...
    } Line_struc;
    用参数结构是从文件中读取的,然后把结构的地址传给structure的*pParam,(之所以这样,因为读文件前我不可能知道dxf文件中的图元是什么类型)
    这样作的目的是希望对于structure中的每个元素是变长的,而不是定长的.现在的问题是
    我在类的某个方法中定义一个参数结构(如Line_struc),将获得的具体参数写入到结构体中,并将该结构体的指针传给structure 的*pParam;
    当离开这个方法的时候,pParam中仍然保留着Line_struc的地址,但内容却已经不是正确的内容了.
    我不知道如何使(Line_struc的)参数结构的内容能比较好的保留在structure 中?
    感谢
    yangsky971(潇洒走一回)
    commandconque(马江王) 提供的方法,
    你们的方法我试验了,仅仅在对参数进行读写操作的方法内是有效的,离开这个方法后内容就是混乱的,虽然地址都是正确的.
    我不知道怎么解决,请帮忙再看看.
    谢谢
      

  7.   

    续上,
    我想问题可能出在对参数进行读写操作的方法中,每次读写参数的是根据dxf文件的特性来的,
    如果图元是圆形,就使用读写园的方法,如果是直线就用直线方法,每种方法种定义的一个临时参数结构,
    所以当离开方法的时候,该地址的数据全部被释放了,虽然structure 中仍然保留的正确地址,但地址的内容已经被释放了.我该怎么解决呢?
      

  8.   

    使用继承 虚函数就可以了, 
    class MediaParam
    {public:
      virtual int GetParamCount ()=0;
      
      void* GetParamValue(int index)=0;};class LineMediaParam: public MediaParam 
    {
    }; 
    class CircleMediaParam: public MediaParam 
    {
    };
      

  9.   

    问题已经解决,不是错在Void上面,而是在对m_lpCurrEntity2链表操作上.
    我没有使用pNextEntity获得下一个元素的指针,而是用数组的方法来调用,导致出错.谢谢大家