找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1370|回复: 9

[研讨] 删除lisp表某位置数据,测试下来很遗憾

[复制链接]

已领礼包: 488个

财富等级: 日进斗金

发表于 2017-2-4 11:42:39 | 显示全部楼层 |阅读模式

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

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

×
本来以为arx写应该会快一点:
就是此函数  (del-pos 2 '(0 1 2 3 4 5)) --> '(1 2 3 4 5)
先准备了9万点 (pts)的表,测试
为了提高arx速度,输入数据不做任何检测,假定都可以返回.
为了提高速度,不用点表输入,如果 (test3 300 pts)的形式还要慢一点点 (很小)
  1. static int ads_test3(){
  2.     resbuf *rb =acedGetArgs ();
  3.    
  4.     resbuf *temp = NULL,*temp1;
  5.     int no;  
  6.     no = rb->resval.rint;
  7.    
  8.     temp = rb;
  9.    
  10.     int i = 0;
  11.     while(i < no){  
  12.       temp =temp->rbnext;
  13.       i++;
  14.     }
  15.     temp1 = temp;
  16.     temp = temp->rbnext;
  17.     temp1->rbnext = temp->rbnext;

  18.     acedRetList(rb->rbnext);

  19.     temp1->rbnext = temp;
  20.   
  21.     acutRelRb(rb);
  22.     return 1;
  23.   }
复制代码
lisp的代码,最老土的方法

  1. (defun del-pos1(n lst / j ret)
  2.         (setq j -1)
  3.         (while lst
  4.                 (if(/= n(setq j(1+ j)))(setq ret(cons (car lst) ret)))
  5.                 (setq lst(cdr lst))
  6.         )
  7.         (reverse ret)
  8. )



每个执行了三遍
(repeat 3(del-pos1 300 pts))
(repeat 3(apply 'test3 (cons 300 pts)))

很遗憾,arx慢。lisp如果改进,差距还要大


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

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-2-4 12:00:02 | 显示全部楼层
ADESK对LISP肯定有藏私的地方,就是对表的读取,肯定有效率高的没告诉我们。
ARX就只能是你这样操作了。
另外,你最后用了acutRelRb(rb); 确定CAD没崩溃? rb不是你动态分配的,释放他们要出错的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2017-2-4 13:59:35 | 显示全部楼层
alisp是桌子单独留的一条小道,你用 ARX 单独处理肯定比混合处理快,这个毋庸置疑,你再去趟这个混水就要自己比较了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

 楼主| 发表于 2017-2-12 23:20:41 | 显示全部楼层

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-2-12 23:32:24 | 显示全部楼层

我说的话和我没给ARX写LISP函数有关联吗? 我是告诉你如果用ARX读LISP数据,只能是你这样写,效率也只能是你说的。 而ADESK自己内部的命令读取LISP的数据效率高,比如mapcar 等等,肯定他们不是用你的写法。怎么写,他们没告诉咱们。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-2-12 23:37:21 | 显示全部楼层

你说的是这个吧  acutRelRb(rb);

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-2-12 23:45:29 | 显示全部楼层

看下帮助文件

int
acutRelRb(
struct resbuf * rb);
rbFirst result buffer to deallocate
Releases the memory allocated to the specified result buffer, to all result buffers that follow it in its linked list, and to any memory allocated to string values in those result buffers.
The acutRelRb() function is the complement of acutNewRb(), but your application should call acutRelRb() to also release memory that is automatically allocated by several other ARX library functions, including the acutBuildList(), acdbEntGet(), acdbEntGetX(), acedGetSym(), acedNEntSelP(), acedNEntSel(), acdbTblNext(), and acdbTblSearch() functions.
If acutRelRb() succeeds, it returns RTNORM; otherwise, it returns an error code.
Include Fileacutads.h


需要手工释放的函数上面列出了。

再看看acedGetArgs函数的帮助

acedGetArgs Global Function
struct resbuf *
acedGetArgs();
Retrieves arguments to requested external function.
Returns a pointer to a linked list of the arguments that AutoLISP has passed to the ARX application through an kInvkSubrMsg message. The acedGetArgs() function retrieves these arguments, allocates result buffers, and places the argument values in these result buffers. If AutoLISP has not passed any arguments to the application, acedGetArgs() returns a null pointer.
After calling acedGetArgs(), the ARX application can traverse the result-buffer list to retrieve and use the function arguments.
Unlike the result lists returned by other ARX library functions, the list returned by acedGetArgs() is managed by the ARX library, so the application does not explicitly have to release the list. (A call to acutRelRb() that specifies this list has no effect.) Applications needing data in the list should make copies of it.



帮助明确说了,和其他的动态分配内存的函数不同,acedGetArgs函数得到的表是由ARX库管理的,应用程序不要显示的释放他们。即使调用也没任何效果。应用程序如果需要这个表数据,比如要添加,删除什么的,要拷贝他们使用。你直接不要在acedGetArgs()得到的resubuf上用指针什么的做操作。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-24 18:16 , Processed in 0.194901 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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