找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1196|回复: 5

[求助]:下面的程序为什么有时候会出错

[复制链接]
发表于 2006-1-19 22:27:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
各位::
给看看这段代码为什么有时候能正确运行。有时候会出错误?CAD over


AcDbEntity *pEnt;
        AcDbDatabase *pCurDb=NULL;

        AcDbObjectId objId,offeld;
        acdbGetObjectId(objId,en);
        acdbOpenAcDbEntity(pEnt,objId,AcDb::kForWrite);

        AcDbVoidPtrArray ptArr;
        AcDbPolyline *pCir;
        pCir = (AcDbPolyline *)pEnt;

        AcGePlane plane;
        AcDb::Planarity flag;
        pCir->getPlane(plane,flag);

        AcGeVector3d nor = pCir->normal();

        AcDbVoidPtrArray entitySet;
        pCir->explode(entitySet);
        pCir->close();
        pCurDb = acdbHostApplicationServices()->workingDatabase();
        AcDbBlockTableRecord *pBlkTableRecord;
        AcDbBlockTable *pBlkTable;
        pCurDb->getBlockTable(pBlkTable, AcDb::kForRead);
        pBlkTable->getAt(ACDB_MODEL_SPACE, pBlkTableRecord, AcDb::kForWrite);
           pBlkTable->close();       
        for(int i = 0;i < entitySet.length();i++)
        {
                AcDbVoidPtrArray ptArr;
                AcDbCurve *pCur = (AcDbCurve *)entitySet.at(i);
                pCur->getOffsetCurves(offVal,ptArr);
                pCur->close();
                       
                 AcDbCurve *pRes = (AcDbCurve *)ptArr.at(0);
                pBlkTableRecord->appendAcDbEntity(offeld, pRes);
                pRes->setLayer(offsetname);
       
       
                pRes->close();
               
        }        
         pBlkTableRecord->close();
     pEnt->close();
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-1-20 09:22:56 | 显示全部楼层
在打开实体或符号表的时候应该判断返回值,尤其是以write方式打开

你的程序具体问题出在哪里,我也看不出来,还得你自己调试~
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-20 09:27:52 | 显示全部楼层
谢谢楼上的提醒!!
这是错误时候的提示~~
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-1-20 09:36:34 | 显示全部楼层
粗劣的看了一下,只看出几个问题
1 pCir = (AcDbPolyline *)pEnt; 这个转换很危险,如果得到的2dpolyline线,在往下运行的过程中会出现错误。
2 AcDbCurve *pRes = (AcDbCurve *)ptArr.at(0);
这个也有问题,pCur->getOffsetCurves(offVal,ptArr);这个函数得倒的 ptArr 数组,不一定只有保存一个实体的指针,可能是多个,如果这里采取这种处理方式,内存未释放, 甚至还可能是0个,这个时候你在用AcDbCurve *pRes = (AcDbCurve *)ptArr.at(0); 将会出错

3 另外一个有可能出错的地方 offVal 的值,这里没有说明,如果 offVal 为 0 的话,也可能导致程序崩溃
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-1-20 09:56:47 | 显示全部楼层
同意楼上的

感觉楼主的程序容错性很差,数组越界以及实体无法打开都没有进行任何判断
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-1-20 11:24:51 | 显示全部楼层
补充我上面说的
还有一点,就是重量线在使用getOffsetCurves会出错
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-23 03:51 , Processed in 0.423771 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表