找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1528|回复: 4

[求助] 找不到崩溃原因,请看下面的代码

[复制链接]
发表于 2013-10-15 20:27:22 | 显示全部楼层 |阅读模式

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

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

×
往下看,出错都地方在if那里
  1.   AcDbCircle *cl;
  2.     double radiu;
  3.     AcGePoint3d center;
  4.     AcGePoint2d pt[3];
  5.     AcGePoint2dArray points1;

  6.     double entity[4][5]={0};
  7.     AcDbLine *line;
  8.     AcDbArc *arc;
  9.     AcDbCircle *circle;
  10.     AcDbPolyline *pPoly;
  11.     AcDbEntity * pEnt;
  12.     ads_name entName;
  13.     long len=0;
  14.     AcDbObjectId entId;
  15.     AcDbObjectIdArray objIds;
  16.     acedSSGet(NULL,NULL,NULL,NULL,entName);
  17.     int rt=acedSSLength(entName,&len);
  18.    
  19.     if (rt == RTNORM)
  20.     {
  21.       long length;
  22.       acedSSLength(entName, &length); // 获得选择集中的对象个数
  23.       for (int i = 0; i < length; i++)
  24.       {
  25.         ads_name ent;
  26.         acedSSName(entName, i, ent);   
  27.         acdbGetObjectId(entId, ent);
  28.         objIds.append(entId);
  29.       }
  30.     }
  31.     else
  32.     {
  33.       MessageBox(NULL,"请选择一个实体","注意",MB_OK);
  34.       return ;
  35.     }
  36.       acedSSFree(entName);
  37.    //以下有4个if语句,只有 AcDbLine的时候才没有问题,其他3个都崩溃,语句几乎都一样怎么其他几个if就崩溃了呢?
  38.   for (int j1=0;j1<objIds.length();j1++)
  39.   {
  40.        acdbOpenObject(pEnt, objIds[j1],AcDb::kForWrite);
  41.     if (pEnt->isKindOf(AcDbLine::desc()))
  42.      {
  43.        line=AcDbLine::cast(pEnt);
  44.        entity[j1][0]=1;
  45.        line->close();
  46.      }
  47.      if (pEnt->isKindOf(AcDbArc::desc()))
  48.      {
  49.        arc=AcDbArc::cast(pEnt);
  50.        entity[j1][0]=2;
  51.         arc->close;
  52.      }
  53.      
  54.      if (pEnt->isKindOf(AcDbCircle::desc()))
  55.      {
  56.        circle=AcDbCircle::cast(pEnt);
  57.        entity[j1][0]=3;
  58.        circle->close;   
  59.      }
  60.      if (pEnt->isKindOf(AcDbPolyline::desc()))
  61.      {
  62.        pPoly=AcDbPolyline::cast(pEnt);
  63.        entity[j1][0]=4;
  64.        pPoly->close;   
  65.      }   
  66.   }

  67.   for (int i=0;i<4;i++)
  68.     {
  69.       for(int j=0;j<5;j++)
  70.       {
  71.         if(entity[j]!=0)
  72.         {
  73.           acutPrintf(("%d\n"),entity[j]);
  74.         }         
  75.       }
  76.     }
  77.   



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

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-10-16 00:20:24 | 显示全部楼层
不谈其他的,你这几个IF ,后三个应该用 else if
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-10-16 00:22:09 | 显示全部楼层
另外, acdbOpenObject(pEnt, objIds[j1],AcDb::kForWrite); 这个你要判断返回时是否是Acad::eOk, 这种地方是必须判断的。OK了,才会执行下面的代码。没OK,你CLOSE,肯定要蹦了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-10-16 00:23:34 | 显示全部楼层
所有的这些close,你都用一个,在相关的代码最后,用一个 pEnt->close()就足够了。 这些都是能减少代码出错的经验。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-10-16 00:27:19 | 显示全部楼层
就你现在这个代码,只在实体是那4种的时候,才关闭对象,其他的,对象就一直打开状态了,而且是打开写,不关闭的话,就再也不能打开其他对象写了(系统只能打开一个对象进行写操作),肯定要蹦了。

记住一点,再你打开对象操作的地方,一定要判断状态,不管中间代码是什么,一定要让代码保证执行的关闭对象的语句。不能把关闭对象放到中间可能执行不到的地方去关闭。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 01:35 , Processed in 0.432038 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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