楚留香 发表于 2012-12-8 00:33:59

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

本帖最后由 楚留香 于 2012-12-8 23:08 编辑

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

gaics 发表于 2012-12-8 10:22:55

1.后面有(setvar "cmdecho" 1),但是前面没有(setvar "cmdecho" 0)
2.循环用的有问题
3.变量与子程序名要区分开(setq psy ( psy1 maxp minp h))

楚留香 发表于 2012-12-8 10:56:20

gaics 发表于 2012-12-8 10:22 static/image/common/back.gif
1.后面有(setvar "cmdecho" 1),但是前面没有(setvar "cmdecho" 0)
2.循环用的有问题
3.变量与子程序名要 ...

十分感谢GAICS的指教,程序可以运行了!
1、现在想法是做成预处理(记录当前绘图环境+设置需要的绘图环境)和后处理函数(保证程序运行后绘图环境不变)。
2、感谢调整成WHILE语句,以前对LISP理解的不深,抄的以前的程序,呵呵,用的都是repeat,简单的也能运行。
3、现在我想对我以前编的lisp都改成函数调用的,以前都是全部的语句,调整太累了!

gaics 发表于 2012-12-8 12:08:10

本帖最后由 gaics 于 2012-12-8 12:11 编辑

楚留香 发表于 2012-12-8 10:56 http://bbs.mjtd.com/static/image/common/back.gif
十分感谢GAICS的指教,程序可以运行了!
1、现在想法是做成预处理(记录当前绘图环境+设置需要的绘图环境 ...

不用客气,我也就初学水平,献丑了!关于循环我是习惯了用while,其实repeat也可以的,你原来写的(setq e (ssname S1 0))这样只是针对一个图元在循环。

ll_j 发表于 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被定义为主程序的局部变量,程序运行结束后,内存中将不再保留他们的空间,但在程序运行时,先定义再调用,看上去是不是和我们在程序开始时对一些变量进行赋值有点相似?

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

楚留香 发表于 2012-12-8 19:15:11

ll_j 发表于 2012-12-8 14:38 static/image/common/back.gif
程序的致命问题就是沙发所说的第三点,程序加载时,定义了(子)函数,后面又被setq把这个函数赋值了,也可 ...

谢谢了!说的很深刻!

gaics 发表于 2012-12-9 09:38:11

ll_j 发表于 2012-12-8 14:38 static/image/common/back.gif
程序的致命问题就是沙发所说的第三点,程序加载时,定义了(子)函数,后面又被setq把这个函数赋值了,也可 ...

说的透彻!

jyzas 发表于 2013-8-6 07:44:41

支持

ymcui 发表于 2013-8-6 08:44:45

支持
页: [1]
查看完整版本: (已解决)标题栏填充程序:子程序在主程序循环中进行调用,但是为什么只能调用一次?