明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2214|回复: 8

(已解决)标题栏填充程序:子程序在主程序循环中进行调用,但是为什么只能调用一次?

[复制链接]
发表于 2012-12-8 00:33:59 | 显示全部楼层 |阅读模式
本帖最后由 楚留香 于 2012-12-8 23:08 编辑

子程序在主程序循环中进行调用,但是为什么只能调用一次?循环就中断了?没有单独做函数时程序是没有问题的,再有这个程序总感觉有谢臃肿,能没有简化一些的办法呢?

本帖子中包含更多资源

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

x
发表于 2012-12-8 10:22:55 | 显示全部楼层
1.后面有(setvar "cmdecho" 1),但是前面没有(setvar "cmdecho" 0)
2.循环用的有问题
3.变量与子程序名要区分开(setq psy ( psy1 maxp minp h))

本帖子中包含更多资源

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

x
 楼主| 发表于 2012-12-8 10:56:20 | 显示全部楼层
gaics 发表于 2012-12-8 10:22
1.后面有(setvar "cmdecho" 1),但是前面没有(setvar "cmdecho" 0)
2.循环用的有问题
3.变量与子程序名要 ...

十分感谢GAICS的指教,程序可以运行了!
1、现在想法是做成预处理(记录当前绘图环境+设置需要的绘图环境)和后处理函数(保证程序运行后绘图环境不变)。
2、感谢调整成WHILE语句,以前对LISP理解的不深,抄的以前的程序,呵呵,用的都是repeat,简单的也能运行。
3、现在我想对我以前编的lisp都改成函数调用的,以前都是全部的语句,调整太累了!
发表于 2012-12-8 12:08:10 | 显示全部楼层
本帖最后由 gaics 于 2012-12-8 12:11 编辑
楚留香 发表于 2012-12-8 10:56
十分感谢GAICS的指教,程序可以运行了!
1、现在想法是做成预处理(记录当前绘图环境+设置需要的绘图环境 ...


不用客气,我也就初学水平,献丑了!关于循环我是习惯了用while,其实repeat也可以的,你原来写的(setq e (ssname S1 0))这样只是针对一个图元在循环。
发表于 2012-12-8 14:38:31 | 显示全部楼层
程序的致命问题就是沙发所说的第三点,程序加载时,定义了(子)函数,后面又被setq把这个函数赋值了,也可以说是重新定义了,函数就不存在了,当然也就只能用一次。

lisp是表结构函数,除非出错或使用函数exit强制退出(也是当作出错处理),否则程序都要进出匹配,使用子函数调用时尤其要注意这一点。A函数调用B函数时,必须要等B函数全部退出,才能继续执行A函数或调用C函数,不会出现没有退出B就调用C的情况,但在没有退出B时,可以由B函数调用C函数,最后的退出次序应该是退出C,再退出B,再退出A,如果思路清楚,在C函数中甚至可以调用B,那么,每个函数的调用就必须有结束的条件,否则会陷入一个死循环。

有时候,可以用函数调用自身来实现循环,那么这种循环就必须有正常退出的条件,否则也是死循环。

当然,循环还是使用repeat或while来得直接,一种是按次数循环,另一种是按条件循环,使用情况略有不同,不好说谁优谁劣,不过我最近倒是喜欢用表结合mapcar来循环,有时候可以使得程序看上去更结构化。

转过来再说函数和变元,虽然赋值方式不同,但实际是一样的,都是“赋值”,所以不能重复,但若在函数中把某变量定义为局部变量,则函数运行结束后,在此函数中的赋值将撤销,也就是说,在两个子函数中可以使用的同样的局部变量名,理论上,在子函数中定义的局部变量名应该可以和主程序(上一级程序)相同,但是,我们不建议这样做。全局变量则不同于局部变量,赋值后会一直保留,从这个意义上,定义的函数也是一种全局变量。

但全局变量和局部变量也是相对的,在acad自带的Lisp程序中,我们可能会见到这样一种结构:
(defun c:XX(/ fun1 fun2 ... a b c ...)
  (defun fun1(s / p)  ;定义子函数
    ...
  )
  (defun fun2(d / f)
    ...
  )
  (....  ;主程序
    (fun1 ss)
    ...
    (fun2 hh)
    ....
  )
)
在这个结构中,子函数fun1、fun2被定义为主程序的局部变量,程序运行结束后,内存中将不再保留他们的空间,但在程序运行时,先定义再调用,看上去是不是和我们在程序开始时对一些变量进行赋值有点相似?

个人一点经验,在大程序中如果定义子函数,则在函数名前面加上“程序名_”作前缀,使用全局变量,则在变量名前面加上“程序名:”前缀,这样自己看得清楚,不容易和其它变量名重复,而且再使用中也不容易和其它程序的函数及变量名干扰。

点评

到位  发表于 2015-7-11 10:34
 楼主| 发表于 2012-12-8 19:15:11 | 显示全部楼层
ll_j 发表于 2012-12-8 14:38
程序的致命问题就是沙发所说的第三点,程序加载时,定义了(子)函数,后面又被setq把这个函数赋值了,也可 ...

谢谢了!说的很深刻!
发表于 2012-12-9 09:38:11 | 显示全部楼层
ll_j 发表于 2012-12-8 14:38
程序的致命问题就是沙发所说的第三点,程序加载时,定义了(子)函数,后面又被setq把这个函数赋值了,也可 ...

说的透彻!
发表于 2013-8-6 07:44:41 | 显示全部楼层
支持
发表于 2013-8-6 08:44:45 | 显示全部楼层
支持
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-28 01:39 , Processed in 0.201235 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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