![]() |
【转帖】发生致命错误,请大伙帮忙看下!
发生致命错误,请大伙帮忙看下!
发生致命错误,请大伙帮忙看下! 我自定义了一个矩形类,就是可以拖放的那种.但是不知道为什么当我拖放完成时候会出现致命错误.无法完成矩形的最终绘制. 哪位大哥可以帮小弟看看是什么原因. 拖放结束后出现: unhandled expception c0000005(access violation reading ox0054)at address 65462ac9h 关掉autcad后 出现 :internal error!xcommand.cpp@3337:was open for write 代码如下: class cmarectwindow : public acdbentity { public: acrx_declare_members(cmarectwindow); cmarectwindow(); virtual ~cmarectwindow(); virtual acad::errorstatus dwgoutfields(acdbdwgfiler* pfiler) const; virtual acad::errorstatus dwginfields(acdbdwgfiler* pfiler); virtual acad::errorstatus dxfinfields(acdbdxffiler* pfiler); virtual acad::errorstatus dxfoutfields(acdbdxffiler* pfiler)const; virtual acad::errorstatus getgrippoints(acgepoint3darray& grippoints, acdbintarray& osnapmasks, acdbintarray& geomids) const; virtual acad::errorstatus movegrippointsat(const acdbintarray& indices, const acgevector3d& offset); virtual adesk::boolean worlddraw(acgiworlddraw* mode); acgepoint3d m_upleftpt; acgepoint3d m_downrightpt; acgepoint3d m_downleftpt; acgepoint3d m_uprightpt; private: }; acrx_dxf_define_members(cmarectwindow, acdbentity, acdb::kdhl_current, acdb::kmreleasecurrent, 0, customentity, /*msg0*/autocad); cmarectwindow::cmarectwindow() { } cmarectwindow::~cmarectwindow() {} acad::errorstatus cmarectwindow::getgrippoints(acgepoint3darray& grippoints, acdbintarray& osnapmasks, acdbintarray& geomids)const { assertreadenabled(); acgepoint3d um,lm,rm,bm; um=m_upleftpt+0.5*(m_uprightpt-m_upleftpt); lm=m_downleftpt+0.5*(m_upleftpt-m_downleftpt); rm=m_downrightpt+0.5*(m_uprightpt-m_downrightpt); bm=m_downleftpt+0.5*(m_downrightpt-m_downleftpt); grippoints.append(um); grippoints.append(rm); grippoints.append(bm); grippoints.append(lm); return acad::eok; } acad::errorstatus cmarectwindow::movegrippointsat(const acdbintarray& indices, const acgevector3d& offset) { assertwriteenabled(); switch(indices[0]) { case 0: m_upleftpt[y]+=offset.y; m_uprightpt[y]+=offset.y; break; case 1: m_uprightpt[x]+=offset.x; m_downrightpt[x]+=offset.y; break; case 2: m_downleftpt[y]-=offset.y; m_downrightpt[y]-=offset.y; break; case 3: m_downleftpt[x]-=offset.x; m_upleftpt[x]-=offset.x; break; default: break; } return acad::eok; } adesk::boolean cmarectwindow::worlddraw(acgiworlddraw* mode) { assertreadenabled(); m_downleftpt[0]=m_upleftpt[0]; m_downleftpt[1]=m_downrightpt[1]; m_downleftpt[2]=0; m_uprightpt[0]=m_downrightpt[0]; m_uprightpt[1]=m_upleftpt[1]; m_uprightpt[2]=0; acgepoint3d plinearray[5]; plinearray[0] =m_upleftpt; plinearray[1] =m_uprightpt; plinearray[2] =m_downrightpt; plinearray[3] =m_downleftpt; plinearray[4] =m_upleftpt; mode->geometry().polyline(5, plinearray); return adesk::ktrue; } acad::errorstatus cmarectwindow::dwginfields(acdbdwgfiler* pfiler) { assertwriteenabled(); acad::errorstatus es; if ((es = acdbentity::dwginfields(pfiler)) != acad::eok) { return es; } pfiler->readitem(&m_upleftpt); pfiler->readitem(&m_downrightpt); pfiler->readitem(&m_downleftpt); pfiler->readitem(&m_uprightpt); return pfiler->filerstatus(); } acad::errorstatus cmarectwindow::dwgoutfields(acdbdwgfiler* pfiler) const { assertreadenabled(); acad::errorstatus es; if ((es = acdbentity::dwgoutfields(pfiler)) != acad::eok) { return es; } pfiler->writeitem(m_upleftpt); pfiler->writeitem(m_downrightpt); pfiler->writeitem(m_uprightpt); pfiler->writeitem(m_downleftpt); return pfiler->filerstatus(); } acad::errorstatus cmarectwindow::dxfinfields(acdbdxffiler* pfiler) { assertwriteenabled(); acad::errorstatus es=acad::eok; resbuf rb; if ((acdbentity::dxfinfields(pfiler)!=acad::eok)||!pfiler->atsubclassdata("cmarectwindow")) { return pfiler->filerstatus(); } acgepoint3d ulpt,urpt,dlpt,drpt; while ((es==acad::eok)&&(es=pfiler->readresbuf(&rb))==acad::eok) { switch(rb.restype) { case kdxfxcoord: ulpt=aspnt3d(rb.resval.rpoint); break; case kdxfxcoord+1: urpt=aspnt3d(rb.resval.rpoint); break; case kdxfxcoord+2: dlpt=aspnt3d(rb.resval.rpoint); break; case kdxfxcoord+3: drpt=aspnt3d(rb.resval.rpoint); break; default: pfiler->pushbackitem(); es=acad::eendoffile; break; } } if (es!=acad::eendoffile) { return acad::einvalidresbuf; } return es; } acad::errorstatus cmarectwindow::dxfoutfields(acdbdxffiler* pfiler) const { assertreadenabled(); acad::errorstatus es; if ((es=acdbentity::dxfoutfields(pfiler))!=acad::eok) { return es; } pfiler->writeitem(acdb::kdxfsubclass,"cmarectwindow"); pfiler->writeitem(acdb::kdxfxcoord,m_upleftpt); pfiler->writeitem(acdb::kdxfxcoord+1,m_uprightpt); pfiler->writeitem(acdb::kdxfxcoord+2,m_downrightpt); pfiler->writeitem(acdb::kdxfxcoord+3,m_downleftpt); return es; } class asdkrectjig:public acedjig { public: asdkrectjig(acgepoint3d &); void doit(); virtual dragstatus sampler(); virtual adesk::boolean update(); virtual acdbentity* entity() const; protected: private: cmarectwindow *mprect; acgepoint3d mupleftpt,mdownrightpt; double m_length,m_height; acgevector3d mnormal; }; asdkrectjig::asdkrectjig(acgepoint3d &pt) { mprect=new cmarectwindow(); mprect->m_upleftpt=pt; } void asdkrectjig::doit() { setdispprompt("\nrect choose the second point:"); acedjig::dragstatus stat=drag(); append(); } acedjig::dragstatus asdkrectjig::sampler() { dragstatus stat; setuserinputcontrols((userinputcontrols) (acedjig::kgovernedbyorthomode |acedjig::kaccept3dcoordinates |acedjig::knonegativeresponseaccepted |acedjig::knozeroresponseaccepted)); static acgepoint3d axispointtemp; stat=acquirepoint(mdownrightpt); if (axispointtemp!=mdownrightpt) { axispointtemp=mdownrightpt; } else if(stat==acedjig::knormal) { return acedjig::knochange; } return stat; } adesk::boolean asdkrectjig::update() { mprect->m_downrightpt=mdownrightpt; return adesk::ktrue; } acdbentity * asdkrectjig::entity() const { return mprect; } // this is command 'rec' void studyrectrec() { // todo: implement the command acgepoint3d temppt; struct resbuf rbfrom,rbto; ads_getpoint(null,"\nrect choose the first point:",asdblarray(temppt)); rbfrom.restype=rtshort; rbfrom.resval.rint=1; rbto.restype=rtshort; rbto.resval.rint=0; ads_trans(asdblarray(temppt),&rbfrom,&rbto,adesk::kfalse,asdblarray(temppt)); asdkrectjig *pjig=new asdkrectjig(temppt); pjig->doit(); delete pjig; } 这可能是一个比较隐蔽的错误,建议作如下尝试。 如果一个类没有提供构造函数,那么编译器自动会提供一个不带参数的构造函数, 但如果提供了一个带参数的构造函数,编译器就不再提供构造函数,问题就出在这里。 class asdkrectjig:public acedjig { public: asdkrectjig(acgepoint3d &); //请再提供一个不带参数的构造函数 void doit(); virtual dragstatus sampler(); virtual adesk::boolean update(); virtual acdbentity* entity() const; protected: private: cmarectwindow *mprect; acgepoint3d mupleftpt,mdownrightpt; double m_length,m_height; acgevector3d mnormal; }; 因为带参数的构造函数只在初始化时被调用一次,而系统最终调用的是不带参数的构造函数(不管你想不想得明白,这是事实),但是你却没有提供,致命错误就出现了。 下面又是一个很矛盾的构造函数,从理论上说,既然在构造函数中用new分配了内存,就应该还有析构函数,且在析构函数中用delete回收内存,否则内存泄漏。这在对象没有被加入到数据库中时是可行的,可是对象被加入到数据库后怎么办,再使用delete会造成cad终止运行,毕竟析构函数是系统自动调用的。 所以我建议不要在asdkrectjig类的构造函数中对cmarectwindow对象进行初始化。其初始化的工作放在其它地方进行。 asdkrectjig::asdkrectjig(acgepoint3d &pt) { mprect=new cmarectwindow(); mprect->m_upleftpt=pt; } 总之,这段程序问题很多,可能还不止我说的上面这些,从感觉上说,即使程序顺利运行,也不可能出现预期的结果。 我的程序也是这样 我拖动的是一个blockreference,当我第一次拖动的时候没有问题 但是当我又创建一个reference的时候当我拖动的时候就会出现上面所说的unhandled这样的错误提示 看到我回复过的帖子浮出水面,忍不住又想说两句! 首先我是工科毕业的,并非计算机专业毕业.大家都知道,任何一个程序,要想一次编译过关几乎是不可能的,或多或少总要出现错误.会下围棋的人都知道这么一句话"棋长一尺,无眼自活",所以当你的水平提高到一定地步的时候,什么样的错误都能明白大概出在什么地方,关键是面对每一个错误都要自己努力的去找出原因. 对于拖动机制,我也吃过很多亏,明明程序的结构没有问题,语法也没有问题,但运行就是有问题,有时候好好的,有时候突然崩溃,有时候想是不是自己真的无能为力了,但又不甘心.后来干脆在拖动的时候都把文档锁定,嘿,还真再没出过问题! 一直都有这样的想法,看到很多人还在黑暗中摸爬滚打,就想写一个教学式的程序,程序的内容就模仿商业化软件中的图库的生成, 出现对话框----生成图形----拖动----指定位置----指定角度,而且每一个商业化软件中还有超级编辑命令,还会对一些特定的实体在屏幕上出现屏幕工具条提示. 所以目前教学内容的初步安排如下: 1,定制实体,学会如何自定义实体 2,定制该自定义实体的mfc对话框 3,定制该自定义实体的拖动机制 4,用协议扩展定制该自定义实体和其它一些实体的超级编辑(如果需要对双击有反应也可以加入) 5,定制该自定义实体的屏幕提示 大家看还需要什么内容,如果我有能力的话也可以加上. 呵呵 `兄弟真是太谢谢你了,请问兄弟有没有联系方式?qq ?? 请问可不可以连续拖动,并且给所拖动的实体 加上自定义属性 我现在有个程序出现这样的毛病,当拖动一个块引用的时候,拖动完添加到数据库中,然后为该实体添加属性(因为我看到arx帮助上写的添加属性只能是为数据库常驻实体添加,当一个实体还没有保存到数据库中会出现enodatabase这样的情况) 当第一次创建一个块引用,然后设置属性的时候没有问题,但是我要是把这段拖动添加属性的程序放在一个循环里就会出现问题,也就是说,当循环第一次的时候没有问题,但是当循环第二次的时候,就会出现unhandled错误(出现在jig->drag()处),当我尝试不放在循环里,一次创建一个实体,没有 问题,当我尝试放在循环中但是不添加属性也没有问题~~ 这个毛病困扰 我一个星期了~~,请楼上的兄弟帮忙分析是怎么回事,好么?? 我qq:27176970 |
所有的时间均为北京时间。 现在的时间是 08:55 AM. |