找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2126|回复: 21

[LISP程序]:为什么如下一小段lisp程序会导至autocad致命错?

[复制链接]
发表于 2002-11-9 16:42:20 | 显示全部楼层 |阅读模式

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

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

×
(defun c:jj()
  (setq i 0)
  (while (< i 2000)
      (setq i (+ i 1))
      (command "line" "0,0" "1,1" "")
      

  )
)

当第一次运行jj时,还尚可,运行若干次后,产生致命错,
用的是autocad2000中文版,或把循环加大,也产生致命错,
在autocad14下,则通常要非常大时,才会导至致命错,
最后试验的结查的,只要执行了command命令几千次,必
产生致命错,这是D版autocad的问题?正版是否有同样的命题,
我的程序在生成图形时,正是要执行几千条command命令,
所以,通常,生成几次后,必定产生致命错,自动退出autocad,
如何解决?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-9 16:49:47 | 显示全部楼层
大家遇到问题不要推到D版,D版实际就是正版的拷贝。

以前贴过,ACAD执行一个COMMAND,要做至少不下20个判断后,才执行真正的。所以推荐大家在大量循环的情况下,一定不要用COMMAND,谁知道这些判断里面是否有什么东西会带来后果。

推荐你用ENTMAKE生成实体替代ACAD的命令。

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

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

发表于 2002-11-9 18:11:20 | 显示全部楼层
是不是重复线条引起的,我把代码更改了一下就不会了。

  1.   [FONT=courier new]
  2. (defun c:jj()
  3.   (setq i 0)
  4.   (while (< i 2000)
  5.     (setq i (+ i 1))
  6.     (command "line" (strcat (itoa i) ",0") "1,1" "")
  7.   )
  8. )
  9.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-11-11 18:26:40 | 显示全部楼层
我估计是你的捕捉没有关掉
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-11-11 19:32:55 | 显示全部楼层
与捕捉无关,无论关闭或打开都这样,
我举的例子,只是用来说明问题,并没有太多的循环.但我的程序生成一张图,最后执行的command,命令总数达至1千多,程序原来是acad12 dos版下的ads程序,已运行几年,非常稳定,前段时间,作少量改进,移至acad2000用objarx重新编译,在生成图形的过程中,经常出现至命错,重新全面检查了程序,没有发现错误,而且在acad12下已生成过几万张图纸,从未发生过至命错。最后发现,要反复生成图形,必然产生致命错,于是想到可能是command执行太多,于是,用上面的lsp程序进行试验,果然如此,最后只能认为,我的程序没问题,可能是autocad的问题,于是,将大部分command换成entmake,果然,出现致命错的机会大大减少,以前生成三四张图后,必然出至命错,现在,生成20多张后,才出现致命错,因为还存在一些command未改。
。虽然这个问题得到了解决,但一直搞不清楚为什么会这样,上面的lisp程序在acad12下,即
使循环很大,也不会出现致命错,这如果不是acad2000的bug,又是什么呢?

所以,在acad2000下使用command来生成图形(不管是lsp arx adsrx) ,你的软件注定是失败的,acad2000真令人失望啊!

我现在的建义是,若要在acad2000下用arx开发,绝对不要用ads_command,用acdb类或entmake生成实体。

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-11 19:37:13 | 显示全部楼层
最初由 qq12345 发布
[B]与捕捉无关,无论关闭或打开都这样,
我举的例子,只是用来说明问题,并没有太多的循环.但我的程序生成一张图,最后执行的command,命令总数达至1千多,程序原来是acad12 dos版下的ads程序,已运行几年,非常稳定,?.. [/B]


你的程序是否使用了大量的选择集?ACAD在选择集大量使用的时候,有内存泄漏,问题应该是内存不够造成的。

另:


  1. 我现在的建义是,若要在acad2000下用arx开发,绝对不要用ads_command,用acdb类或entmake生成实体。
复制代码


这个应该改改,不推荐使用ADSRX,要用对象自身的构造函数去生成实体。代码非常简单,代码也很清晰。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

发表于 2002-11-11 19:47:45 | 显示全部楼层
我觉的AutoCAD增加了判断功能,不允许相同的对象太多。因为你生成的都是在同一位置同一长度的直线,实际中是没有意义。
故而出错,我更换了直线的位置和长度后就没事了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-11-11 19:49:09 | 显示全部楼层
虽然我用了大量的选择集,但都非常小心的一一释放了,而且专门写了一个程序,
用来测试我的arx程序是否没有释放一些选择集,结果是全都安全释放了(生成图形后,可用
选择集仍为128)。但让我百思不解的是上面lsp程序的问题,难道在acad2000的command下,
手工的键入几千条命令,会让acad200崩溃,真不不可思议。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-11-11 21:36:20 | 显示全部楼层
我连续测试你的程序十多次没有发生错误
但如果捕捉打开速度慢十多倍或者几十倍

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-11 21:46:44 | 显示全部楼层
最初由 qq12345 发布
[B]虽然我用了大量的选择集,但都非常小心的一一释放了,而且专门写了一个程序,
用来测试我的arx程序是否没有释放一些选择集,结果是全都安全释放了(生成图形后,可用
选择集仍为128)。但让我百思不解的是上面lsp程... [/B]


你看看论坛以前的帖子,使用大量选择集的时候,即使都释放,ACAD也会造成内存耗尽。因为ACAD仅仅释放的选择集,避免造成128个选择集上限的限制,但是内存并没有归还操作系统。ADESK就这么解释的,他们也没有说这是个BUG。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-11-11 23:40:06 | 显示全部楼层
感谢XDSoft的提醒。另fylinwater,你是否在acad2002 下测试,在我的acad2000 下试过
很多次,执行command几千次后,必定产生致命错。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-11-11 23:54:09 | 显示全部楼层
都试了20000次也没发现出错。
建议:
用acad2002
用repeat,只要你知道次数。
用entmake。
控制捕捉,回显等系统变量。。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-11-11 23:57:04 | 显示全部楼层
To cy956:
你试20000次未出现问题,你是在acad2000还是acad2002下测试的?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-11-12 00:05:17 | 显示全部楼层
要更正一下,我把次数设到20000次,中途不耐烦cancel了,
不过一查,已经9140多条了。command太慢了。以前做过
测试,和entmake比好像相差3~6倍。

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

使用道具 举报

发表于 2002-11-12 00:08:58 | 显示全部楼层
用2002,没退出
只是出现Too many objects selected for INTERSECT
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-26 07:51 , Processed in 0.247470 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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