明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 843|回复: 10

[基础] 子函数的返回值,主函数是如何调用的,主函数是如何调用子函数的,格式如何?

[复制链接]
发表于 2018-5-23 11:27 | 显示全部楼层 |阅读模式
本帖最后由 zzl9105 于 2018-5-23 11:33 编辑

如题,子函数的返回值,主函数是如何调用的,主函数是如何调用子函数的,格式如何?子函数甲,能调用子函数乙吗?格式又是如何?
目前还没有找到相关的介绍,或者教程之类的。
关于这个问题,我已经发了好几个这样的帖子了,希望这次不要再次沉下去了。
谢谢大虾不吝赐教,万分感谢!!!
发表于 2018-5-24 09:59 | 显示全部楼层
昨天网络卡住,发重了。。。
在回答en的问题前,先说下defun的格式
(defun aa (/ a2 bb)
    (setq a1 ...)
    (setq a2 ...)
    (defun bb (b1 / b2)
        (setq a1 1)
        (setq b2 ...)
    )
    (defun cc (/ c2)
        (setq a1 2)
        (setq c1 ...)
        (setq c2 ...)
    )
    (setq c (bb x))
    (cc)
)

以下关于全局变量和局部变量的定义都是我个人的理解,仅供参考
a1没有申明,在赋值后,在整个AutoCAD(包括其他的程序或函数)中都可以调用,是真正的全局变量
a2在aa中有申明,可以在aa和它的子函数中bb,cc调用,是aa的局部变量
bb在aa中有申明,可以在aa和它的子函数中调用,是aa的局部子函数,如果不申明,则可以认为是全局函数
cc没有申明,在整个AutoCAD(包括其他的程序或函数)中都可以调用,可以认为是全局函数
b1是bb的参数,在(defun bb)中的b1,名称可以是a1,a2,cc之类的都可以,只要你确定不会再bb中使用到这些符号原来的内容,b1也只在(defun bb)中生效
b2在bb中申明,只能在bb中调用,是bb的局部变量
c1没有申明,是全局变量
c2在cc中申明,只能在cc中调用,是cc的局部变量

调用子函数时
bb因为定义了变量b1,所以要用(bb x),x就是要代入b1的值。如果定义的是(defun bb (b1 b2 b3 ... / ) ...),那调用时用(bb b1 b2 b3 ...)
cc没有定义变量,所以(cc)就可以

以上说的变量调用,指的是变量发生变化
(setq c (bb x)),c赋予了返回值,但bb函数本身运行的时候对a1进行了赋值,所有a1变为了1
(cc)运行后,a1变为了2
以上对于a1的赋值,是在子函数运行过程中就发生的,与最后的子函数返回值没有关系

个人理解,子函数有两个重要部分,一是本体,二是返回值。
在小程序中用本体直接处理上级函数的变量,比较方便,但代码多了后,不容易管理和维护,所以那种通用的子函数库,建议使用返回值进行处理。
如果要返回的变量有多个,就用变量的列表做返回值。
回复 支持 1 反对 0

使用道具 举报

发表于 2018-5-23 14:08 | 显示全部楼层
;|------
大概说一下
a1: aa局部变量,bb未定义,bb的操作会对所有函数中的a1产生影响
a2: aa局部变量,bb局部变量,bb的操作只对bb里的a2产生影响,aa里的a2不变
a3: aa局部变量,bb未定义,值为bb函数的最后一行代码的值
b1: aa局部变量,bb未定义,bb的操作会对所有函数中的b1产生影响
b2: aa局部变量,bb局部变量,bb的操作只对bb里的b2产生影响,aa里的b2不变
b3: aa局部变量,bb局部变量,bb函数的最后一行代码的值会作为返回值返回,
    如果最后一行是(princ),则为nil
    如果不喜欢类似a1这种变量,可以返回列表型的a3,然后在aa里提取
------|;
(defun aa (/ a1 a2 a3 b1 b2 b3)
    (setq a1 "aa-a1")
    (setq a2 "aa-a2")
    (defun bb (/ a2 b2 b3)
        (setq a1 "bb-a1")
        (setq a2 "bb-a2")
        (setq b1 "bb-b1")
        (setq b2 "bb-b2")
        (setq b3 (list b1 b2))
        (princ "\nbb-a1=")(princ a1)
        (princ "\nbb-a2=")(princ a2)
        (princ "\nbb-a3=")(princ a3)
        (princ "\nbb-b1=")(princ b1)
        (princ "\nbb-b2=")(princ b2)
        (princ "\nbb-b3=")(princ b3)
        b3
    )
    (setq a3 (bb))
    (princ "\naa-a1=")(princ a1)
    (princ "\naa-a2=")(princ a2)
    (princ "\naa-a3=")(princ a3)
    (princ "\naa-b1=")(princ b1)
    (princ "\naa-b2=")(princ b2)
    (princ "\naa-b3=")(princ b3)
    (princ)
)
命令: (aa)
bb-a1=bb-a1
bb-a2=bb-a2
bb-a3=nil
bb-b1=bb-b1
bb-b2=bb-b2
bb-b3=(bb-b1 bb-b2)
aa-a1=bb-a1
aa-a2=aa-a2
aa-a3=(bb-b1 bb-b2)
aa-b1=bb-b1
aa-b2=nil
aa-b3=nil
发表于 2018-5-23 14:17 | 显示全部楼层
(defun aa()
    (defun bb (/ b1)
        (setq b1  )
        (setq b2  )
    )
    (defun cc (/ c1)
        (setq c1  )
        (setq c2  )
    )
)

;|=======
bb和cc可以互相调用,b2和c2可以直接调用,但b1和c1不能调用
b1、b2、c1、c2如果是定义的子函数的话,也是一样的
发表于 2018-5-23 14:19 | 显示全部楼层
(defun aa()
    (defun bb (/ b1)
        (setq b1  )
        (setq b2  )
    )
    (defun cc (/ c1)
        (setq c1  )
        (setq c2  )
    )
)

;|=======
aa可以调用bb和cc,可以调用b2和c2,但不能调用b1和c1
bb可以调用cc,可以调用b1,b2和c2,但不能调用c1
cc可以调用bb,可以调用c1,c2和b2,但不能调用b1
b1、b2、c1、c2如果是定义的子函数的话,也是一样的

点评

非常感谢  发表于 2018-5-23 14:43
发表于 2018-5-23 14:22 | 显示全部楼层
关于子函数返回值,就是子函数的最后一行代码值,比如,如果是(setq ...),就返回setq的值,如果是(princ),返回nil

点评

非常感谢  发表于 2018-5-23 14:41
 楼主| 发表于 2018-5-23 15:02 | 显示全部楼层
本帖最后由 zzl9105 于 2018-5-23 15:49 编辑
lostbalance 发表于 2018-5-23 14:17
(defun aa()
    (defun bb (/ b1)
        (setq b1  )

主函数和子函数,是不是应该这样写更显得独立性和有层次感:
(defun AA( / en b1 b2 c1 c2)
        (setq en  )      
       (setq b1  )
        (setq b2  )
        (setq c1  )
        (setq c2  )
       (setq zj (BB en ))
        (setq str (CC en ))      
)

    (defun BB (/ b1)
        (setq b1  )
        (setq b2  )
    )
    (defun CC (/ c1)
        (setq c1  )
        (setq c2  )
我的问题是:
1、主函数中的对象en,子函数可以直接作为对象调用不?
2、我想要的返回的值是对这个对象en的一个综合操作后的结果值。
3、我需不需要在主函数中定义一个全局变量对象值en,然后再在子函数中再次定义en为子函数的全局变量,这样以来,就可以直接调用了。
4、调用子函数时,它后面是跟en呢,还是有什么其它格式要求?
说白了,就是我的子函数,只是对主函数中的某个特定对象进行一个特定综合操作后想要的一个结果值,我直接在主函数中调用这个结果值,就OK了,这样也能体现程序操作的层次感。子函数也更能体现出通用函数的特点出来







 楼主| 发表于 2018-5-24 11:56 | 显示全部楼层
初步发现,主子函数都有定义的局部变量,比如ssa,子函数该变量的值,会影响主函数ssa的值,最终使主程序计算出错。
发表于 2018-5-24 12:45 | 显示全部楼层
zzl9105 发表于 2018-5-24 11:56
初步发现,主子函数都有定义的局部变量,比如ssa,子函数该变量的值,会影响主函数ssa的值,最终使主程序计 ...

这个问题属于变量的作用域。
子函数定义如下:
(defun subroutine ( / ssa)
...
)
将 ssa 放到斜杠后面,就属于局部变量,否则就属于全局变量,当然会影响主函数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-29 00:21 , Processed in 0.202883 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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