革天明 发表于 2012-1-10 09:51:07

如何自定义两个返回值的函数

函数有两个返回值,如何调用而不出错?不给这个函数形参可以吗?
;==================================================================
(DEFUN MYAREA( / ss nr tot_area txt en )
(if (setq ss (ssget '()))
    (progn
      (setq nr      0
            tot_area 0.0
            en      (ssname ss nr)
            TXT   ""
      );end setq
      (while en
            (command "._area" "_O" en)
      (setq tot_area (+ tot_area (ATOF(RTOS (getvar "area") 2 2)))
               nr       (1+ nr)
               en       (ssname ss nr)
            TXT      (STRCAT TXT "+" (RTOS (getvar "area") 2 2) )
      );end setq
      );end while
    '(tot_area txt);这里是返回的结果
    );end progn
    nil;else if
);end if
);end defun
;-------------------------------------------------------------

革天明 发表于 2012-1-10 09:55:28

调用时这样写感觉很怪
(setq a1(car(myarea)))
(setq str1(cadr(myarea)))
(setq a2(car(myarea)))
(setq str2(cadr(myarea)))
因为感觉没有让程序分清那个是第一次返回的结果,那里开始重新调用函数,请指教!

byghbcx 发表于 2012-1-10 10:35:21

(setq area (myarea)),不要每次都运行myarea函数

革天明 发表于 2012-1-10 10:51:19

(SETQ AREA1(MYAREA))
(SETQ AREA2(MYAREA))
(setq a1(car(AREA1)))
(setq str1(cadr(AREA1)))
(setq a2(car(AREA2)))
(setq str2(cadr(AREA2)))
是这样吗?

革天明 发表于 2012-1-10 11:02:19

本帖最后由 革天明 于 2012-1-10 13:50 编辑

;==================================================================
(DEFUN MYAREA( / ss nr tot_area txt en )
(if (setq ss (ssget '()))
    (progn
      (setq nr             0
            tot_area 0.0
            en             (ssname ss nr)
            TXT   ""
      );end setq
      (while en
      (command "._area" "_O" en)
      (setq tot_area (+ tot_area (ATOF(RTOS (getvar "area") 2 2)))
            nr       (1+ nr)
            en       (ssname ss nr)
            TXT      (STRCAT TXT "+" (RTOS (getvar "area") 2 2) )
      );end setq
      );end while
(LIST tot_area txt)
    );end progn
    nil;else if
);end if
);end defun
;-------------------------------------------------------------
(DEFUN C:TS()
(SETQ AREA1(MYAREA)
      AREA2(MYAREA)
      A1(CAR AREA1)
      T1(CADR AREA1)
      A2(CAR AREA2)
      T2(CADR AREA2)
      A(- A1 A2)
)
(PRINC (RTOS A 0 2))
(PRIN1)
)
改成这样就能运行了,C:TEST最好不用,是LISP保留的,使用(list )来组成表比'(....)这样的好,具体原因不知道
有懂的人请指教。

millermin 发表于 2012-1-10 11:08:56

如此
(SETQ AREA1(MYAREA))
(SETQ AREA2(MYAREA))
就能得到两个不同结果吗?我估计area1=area2.
我将结果用list ( ab )
然后再用你的car和cadr 分离结果。就像计算xy坐标一样。

jingxueyun 发表于 2012-1-10 11:29:18

兄弟,C:TEST是系统关键字哦。
我改成了C:TT 测试没有问题啊

jingxueyun 发表于 2012-1-10 11:32:35

错误: 参数类型错误: numberp: TOT_AREA
上面这句话的意思是:一个数字型的变量发生错误,该变量的名称是TOT_AREA

jingxueyun 发表于 2012-1-10 13:58:31

;计算单次选定对象的总面积
(defun aream (/ olderr oldcmdecho errexit undox restore ss1 nr en)
(defun undox ()
    (command "._undo" "_E")
    (setvar "cmdecho" oldcmdecho)
    (setq *error* olderr)
    (princ)
)
(setq olderr*error*
      restore undox
      *error* errexit
)
(setq oldcmdecho (getvar "cmdecho"))
(setvar "cmdecho" 0)
(command "._UNDO" "_BE")
(if (setq ss1 (ssget '((-4 . "<OR")
                         (0 . "POLYLINE")
                         (0 . "LWPOLYLINE")
                         (0 . "CIRCLE")
                         (0 . "ELLIPSE")
                         (0 . "SPLINE")
                         (0 . "REGION")
                         (-4 . "OR>")
                        )
                )
      )
    (progn
      (setq nr 0)
      (setq tot_area 0.0)
      (setq en (ssname ss1 nr))
      (while en
      (command "._area" "_O" en)
      (setq tot_area (+ tot_area (getvar "area")))
      (setq nr (1+ nr))
      (setq en (ssname ss1 nr))
      )
    )
)
)
;计算面积之差
(defun C:MJ()
(aream)
(setq mj1 tot_area)
(princ "\n第一次所选图形的面积是:")
(princ mj1)

(aream)
(setq mj2 tot_area)
(princ "\n第二次所选图形的面积是:")
(princ mj2)

(princ "\n第一次和第二次所选图形的面积之差为:")
(- mj1 mj2)
)

byghbcx 发表于 2012-1-10 14:02:33

本帖最后由 byghbcx 于 2012-1-10 14:04 编辑

革天明 发表于 2012-1-10 11:02 http://bbs.mjtd.com/static/image/common/back.gif
;==================================================================
(DEFUN MYAREA( / ss nr tot_area ...

使用(list )来组成表比'(....)这样的好,具体原因不知道,有懂的人请指教。
(list)是组建新表,里面可以有变量值,'(....),'是括号中的值禁止求值,也就是变量值不会被读取。在'(tot_area txt   ...)中会把tot_area当作自定义符号在运行。
页: [1] 2
查看完整版本: 如何自定义两个返回值的函数