目前在正在作一个有关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、直线
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必须指向一个类/结构/联合"不知道怎么解决
错误说"thick必须指向一个类/结构/联合"
这个当然会出错了~~~
m_lpCurrEntity2->pParam为void *~~
而thick所对应的应该是struct _dxfLine类型,这个
m_lpCurrEntity2->pNextEntity->thick应该没有问题~~~
param=(PDXFTEXTPARAM )m_lpCurrEntity2->pParam;
param->thick;
....
如:
DXFCIRCELPARAM cir;
DXFCIRCELPARAM *p_cir;
LPVOID lpCir;
lpCir = cir;
p_cir = (PDXFCIRCELPARAM)lpCir;
其实void挺好用的
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(马江王) 提供的方法,
你们的方法我试验了,仅仅在对参数进行读写操作的方法内是有效的,离开这个方法后内容就是混乱的,虽然地址都是正确的.
我不知道怎么解决,请帮忙再看看.
谢谢
我想问题可能出在对参数进行读写操作的方法中,每次读写参数的是根据dxf文件的特性来的,
如果图元是圆形,就使用读写园的方法,如果是直线就用直线方法,每种方法种定义的一个临时参数结构,
所以当离开方法的时候,该地址的数据全部被释放了,虽然structure 中仍然保留的正确地址,但地址的内容已经被释放了.我该怎么解决呢?
class MediaParam
{public:
virtual int GetParamCount ()=0;
void* GetParamValue(int index)=0;};class LineMediaParam: public MediaParam
{
};
class CircleMediaParam: public MediaParam
{
};
我没有使用pNextEntity获得下一个元素的指针,而是用数组的方法来调用,导致出错.谢谢大家