找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2809|回复: 15

[求助] 求最大面积并放在数组首位,代码如下,程序崩溃,求解释

[复制链接]
发表于 2013-10-5 21:53:35 | 显示全部楼层 |阅读模式

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

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

×
求最大面积并放在数组首位,代码如下,程序崩溃,求解释       
{
               ads_name entName;
                AcDbObjectId entId;
                AcDbObjectIdArray objIds;
                int j4;
                long len=0;
                AcDbPolyline *pPoly1;
                double area1[10];
                AcDbEntity * pEnt;
                acedSSGet(NULL,NULL,NULL,NULL,entName);
                int rt=acedSSLength(entName,&len);
               
                if (rt == RTNORM)
                {
                        long length;
                        acedSSLength(entName, &length); // 获得选择集中的对象个数
                        for (int i = 0; i < length; i++)
                        {
                                ads_name ent;
                                acedSSName(entName, i, ent);               
                                acdbGetObjectId(entId, ent);
                                objIds.append(entId);
                        }
                       
                }       
               
                for (int j3=0;j3<objIds.length();j3++)//求面积
                {
                        acdbOpenObject(pEnt,objIds[j3],AcDb::kForRead);
                        pPoly1=AcDbPolyline::cast(pEnt);       
                        pPoly1->getArea(area1[j3]);
                       
                }
                pPoly1->close();
                pEnt->close();
               
                                  for (int j2=0;j2<objIds.length();j2++)//判断最大面积
                                  {
                                 if (area1[j2]>area1[0])
                                         j4=j3;
                                }
                acutPrintf("最大面积%.0f\n",area1[j4]);
                objIds.swap(j4,0);
                acedSSFree(entName);
        }

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

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-10-5 22:45:56 | 显示全部楼层
首先
pPoly 和 pEnt是一个实体,不要关闭两次。

再:

你选了多少个实体,你面积数组才10,够放下的吗?

点评

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

使用道具 举报

 楼主| 发表于 2013-10-5 22:47:15 | 显示全部楼层
XDSoft 发表于 2013-10-5 22:45
首先
pPoly 和 pEnt是一个实体,不要关闭两次。

我才三四个实体而已

点评

多少实体,你也不要这样写 换double动态数组,和你定义那个ID数组一样的使用 AcArray area; 往这个里面添加。 你按我说的先改了,然后把改后的代码和执行时候出现的错误信息帖上来。  详情 回复 发表于 2013-10-5 22:50
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-10-5 22:50:57 | 显示全部楼层
yzf_fs 发表于 2013-10-5 22:47
我才三四个实体而已

多少实体,你也不要这样写

换double动态数组,和你定义那个ID数组一样的使用

AcArray<double> area;

往这个里面添加。

你按我说的先改了,然后把改后的代码和执行时候出现的错误信息帖上来。

点评

是这样吗? AcArray area1; double area; AcDbEntity * pEnt; acedSSGet(NULL,NULL,NULL,NULL,entName); int rt=acedSSLength(entName,&len); if (rt == RTNORM) { long length; acedS  详情 回复 发表于 2013-10-5 23:07
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-5 23:07:13 | 显示全部楼层
XDSoft 发表于 2013-10-5 22:50
多少实体,你也不要这样写

换double动态数组,和你定义那个ID数组一样的使用

是这样吗?     
  AcArray<double> area1;
        double area;
        AcDbEntity * pEnt;
        acedSSGet(NULL,NULL,NULL,NULL,entName);
        int rt=acedSSLength(entName,&len);
       
        if (rt == RTNORM)
        {
                long length;
                acedSSLength(entName, &length); // 获得选择集中的对象个数
                for (int i = 0; i < length; i++)
                {
                        ads_name ent;
                        acedSSName(entName, i, ent);               
                        acdbGetObjectId(entId, ent);
                        objIds.append(entId);
                }
        }       
        for (int j3=0;j3<objIds.length();j3++)
        {
                acdbOpenObject(pEnt,objIds[j3],AcDb::kForRead);
                pPoly1=AcDbPolyline::cast(pEnt);
                pPoly1->getArea(area);
                area1.append(area);
        }
        pPoly1->close();
        }       
                for (int j2=0;j2<area1.length();j2++)//判断最大面积
                                  {
                                 if (area1[j2]>area1[0])
                                         j4=j2;
                                }
                acutPrintf("最大面积%.0f\n",area1[j4]);
                objIds.swap(j4,0);
                acedSSFree(entName);
        }
       

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-10-5 23:20:00 | 显示全部楼层
写代码的时候,有返回值的关键地方,都要判断,成功才继续操作

比如 acdbOpenObject(pEnt,objIds[j3],AcDb::kForRead);
要:
   if (acdbOpenObject(pEnt,objIds[j3],AcDb::kForRead)==eOk)
   {
   }else
       return;

这样,哪个地方有错误你猜好找的

包括下面的 pPoly=AcDbPolyline::cast ,你要判断pPoly不为NULL,才继续操作,否则如果实体不是AcDbPolyline就死那了。

你可以把代码段按循环处理分段从后注释掉,看看是哪行代码出现的错误。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-10-5 23:32:41 | 显示全部楼层
                for (int i = 0; i < length; i++)
                {
                        ads_name ent;
                        acedSSName(entName, i, ent);               
                        acdbGetObjectId(entId, ent);
                        objIds.append(entId);
                }

这个地方,把 int i 换成 long i

点评

还是奔溃。。。。。。。。。。。 acedSSGet(NULL,NULL,NULL,NULL,entName); int rt=acedSSLength(entName,&len); if (rt == RTNORM) { long length; acedSSLength(entName, &length); // 获得选择  详情 回复 发表于 2013-10-6 09:05
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-6 09:05:53 | 显示全部楼层
XDSoft 发表于 2013-10-5 23:32
for (int i = 0; i < length; i++)
                {
                        ads_nam ...

还是奔溃。。。。。。。。。。。

acedSSGet(NULL,NULL,NULL,NULL,entName);
        int rt=acedSSLength(entName,&len);
       
        if (rt == RTNORM)
        {
                long length;
                acedSSLength(entName, &length); // 获得选择集中的对象个数
                for (long i = 0; i < length; i++)
                {
                        ads_name ent;
                        acedSSName(entName, i, ent);               
                        acdbGetObjectId(entId, ent);
                        objIds.append(entId);
                }
//////////////////////////////////////////加了下面的代码就奔溃,注释掉就没事,可是注释掉就实现不了我要的功能了
                for (int j3=0;j3<objIds.length();j3++)
                {
                        if (acdbOpenObject(pEnt,objIds[j3],AcDb::kForRead)==Acad::eOk)
                        {
                                if (pPoly1!=NULL)
                                {
                                        pPoly1=AcDbPolyline::cast(pEnt);
                                        pPoly1->getArea(area);
                                        area1.append(area);
                                }       
                        }
       
                }
                pPoly1->close();       
        }       
         return objIds;        acedSSFree(entName);

点评

你改的不对,pPoly 你用下面代码换崩溃那部分,试试 for (int j3=0;j3getArea(area); area1.append(area);  详情 回复 发表于 2013-10-6 09:34
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-10-6 09:34:41 | 显示全部楼层
yzf_fs 发表于 2013-10-6 09:05
还是奔溃。。。。。。。。。。。

acedSSGet(NULL,NULL,NULL,NULL,entName);

你改的不对,pPoly

你用下面代码换崩溃那部分,试试

              for (int j3=0;j3<objIds.length();j3++)
                {
                        if (acdbOpenObject(pPoly1,objIds[j3],AcDb::kForRead)==Acad::eOk)
                        {
                                        pPoly1->getArea(area);
                                        area1.append(area);      
                                       pPoly1->close();   
                        }
        
                }
               

点评

好像成功了,完整代码如下,十分感谢晓东一直以来对我的帮助 AcDbObjectIdArray Ccalculation::SelectObj(ads_name &entName,AcDbObjectId &entId,AcDbObjectIdArray& objId) { int j4;  详情 回复 发表于 2013-10-6 10:42
换了那部分代码行了,可是下面的又奔溃了 if (area1.length()!=NULL) { for (int j2=0;j2area1[0]) j4=j2; } objId.swap(j4,0); }  详情 回复 发表于 2013-10-6 10:09
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-6 10:09:30 | 显示全部楼层
XDSoft 发表于 2013-10-6 09:34
你改的不对,pPoly

你用下面代码换崩溃那部分,试试

换了那部分代码行了,可是下面的又奔溃了
        if (area1.length()!=NULL)
        {
                for (int j2=0;j2<area1.length();j2++)
                 {
                if (area1[j2]>area1[0])
                        j4=j2;
                }
                objId.swap(j4,0);
        }

点评

area1.length()返回的是整数,不能用NULL判断 你要判断如果数组有值才操作,用 if (!area1.isEmpty()) { ... } or if (area1.length()>0) { ... }  详情 回复 发表于 2013-10-6 10:55
好像成功了,完整代码如下,十分感谢晓东一直以来对我的帮助 AcDbObjectIdArray Ccalculation::SelectObj(ads_name &entName,AcDbObjectId &entId,AcDbObjectIdArray& objId) { int j4; AcDbPo  详情 回复 发表于 2013-10-6 10:41
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-6 10:41:01 | 显示全部楼层
yzf_fs 发表于 2013-10-6 10:09
换了那部分代码行了,可是下面的又奔溃了
        if (area1.length()!=NULL)
        {

好像成功了,完整代码如下,十分感谢晓东一直以来对我的帮助{:soso_e179:}
AcDbObjectIdArray Ccalculation::SelectObj(ads_name &entName,AcDbObjectId &entId,AcDbObjectIdArray& objId)
{
        int j4;

        AcDbPolyline *pPoly1;
        AcArray<double> area1;
        double area;
        AcDbEntity * pEnt1;
        int rt=acedSSGet(NULL,NULL,NULL,NULL,entName);
       
        if (rt == RTNORM)
        {
                long length;
                acedSSLength(entName, &length); // 获得选择集中的对象个数
                for (long i = 0; i < length; i++)
                {
                        ads_name ent;
                        acedSSName(entName, i, ent);               
                        acdbGetObjectId(entId, ent);
                        objId.append(entId);
                }
        }

                for (int j3=0;j3<objId.length();j3++)
                {
                        if (acdbOpenObject(pPoly1,objId[j3],AcDb::kForRead)==Acad::eOk)
                        {


                                        pPoly1->getArea(area);
                                        area1.append(area);      
                    pPoly1->close();          
                        }
       
                }
                for (int j2=0;j2<area1.length();j2++)
                 {
                       
                if (area1[j2]>=area1[0])
                {       
                        area1[0]=area1[j2];
                        j4=j2;
                       
                }
                }

                objId.swap(j4,0);

        return objId;
        acedSSFree(entName);
                       
}


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

使用道具 举报

 楼主| 发表于 2013-10-6 10:42:21 | 显示全部楼层
XDSoft 发表于 2013-10-6 09:34
你改的不对,pPoly

你用下面代码换崩溃那部分,试试

好像成功了,完整代码如下,十分感谢晓东一直以来对我的帮助{:soso_e179:}
AcDbObjectIdArray Ccalculation::SelectObj(ads_name &entName,AcDbObjectId &entId,AcDbObjectIdArray& objId)
{
        int j4;

        AcDbPolyline *pPoly1;
        AcArray<double> area1;
        double area;
        AcDbEntity * pEnt1;
        int rt=acedSSGet(NULL,NULL,NULL,NULL,entName);
        
        if (rt == RTNORM)
        {
                long length;
                acedSSLength(entName, &length); // 获得选择集中的对象个数
                for (long i = 0; i < length; i++)
                {
                        ads_name ent;
                        acedSSName(entName, i, ent);               
                        acdbGetObjectId(entId, ent);
                        objId.append(entId);
                }
        }

                for (int j3=0;j3<objId.length();j3++)
                {
                        if (acdbOpenObject(pPoly1,objId[j3],AcDb::kForRead)==Acad::eOk)
                        {


                                        pPoly1->getArea(area);
                                        area1.append(area);      
                    pPoly1->close();           
                        }
        
                }
                for (int j2=0;j2<area1.length();j2++)
                 {
                        
                if (area1[j2]>=area1[0])
                {        
                        area1[0]=area1[j2];
                        j4=j2;
                        
                }
                }

                objId.swap(j4,0);

        return objId;
        acedSSFree(entName);
                        
}

点评

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-10-6 10:51:57 | 显示全部楼层
yzf_fs 发表于 2013-10-6 10:42
好像成功了,完整代码如下,十分感谢晓东一直以来对我的帮助
AcDbObjectIdArray Ccalculat ...

你知道问题发生在哪了吗?

点评

area1[0]=area1[j2]; 还要写上这一句  详情 回复 发表于 2013-10-6 14:41
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-10-6 10:55:28 | 显示全部楼层
yzf_fs 发表于 2013-10-6 10:09
换了那部分代码行了,可是下面的又奔溃了
        if (area1.length()!=NULL)
        {

area1.length()返回的是整数,不能用NULL判断

你要判断如果数组有值才操作,用

if (!area1.isEmpty())
{
  ...
}

or

if (area1.length()>0)
{
   ...
}

点评

如果每执行一次都初始化一次,在前面加 objId.removeSubArray(0,10);可是,这是什么原因? long len=0; AcDbPolyline *pPoly1; AcArray area1; double area; objId.removeSubArray(0,10  详情 回复 发表于 2013-10-6 15:06
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-6 14:41:52 | 显示全部楼层
XDSoft 发表于 2013-10-6 10:51
你知道问题发生在哪了吗?

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 17:10 , Processed in 0.519217 second(s), 75 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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