jack093 发表于 2019-3-19 15:15:08

动态修改表元素

本帖最后由 jack093 于 2019-3-19 15:16 编辑

例如有以下数组(a1 b1 c1 d1) (a2 b2 c2 d2 ) (a3 b3 c3 d3) ... (an bn cn dn)如何修改其中的第i行第j列
(defun lstmod(lst i j val/)
...


请赐教



fangmin723 发表于 2019-3-19 15:22:34

本帖最后由 fangmin723 于 2019-3-19 15:24 编辑

nth 配合 subst 使用

jack093 发表于 2019-3-20 08:48:08

fangmin723 发表于 2019-3-19 15:22
nth 配合 subst 使用

你好, subst 使用有些不熟,只会在entmod的时候用,是这样吗?
                (setq ent (entget tem))
                (entmod (subst (cons 8 "00")(assoc 8 ent) ent)))
我只会用循环nth 重新构造一个表,可能太笨了,

xyp1964 发表于 2019-3-20 09:12:57

;|
abc 修改表中的第i行第j列元素
双重表 '((a1 b1 c1 d1) (a2 b2 c2 d2 ) (a3 b3 c3 d3) ... (an bn cn dn))
实例:
(setq lst '((1 2 3) (4 5 6) (7 8 9) (10 11 12 13 14)))
(abc lst 3 2 100) → '((1 2 3) (4 5 6) (7 8 9) (10 11 100 13 14))
|;
(defun abc (lst n1 n2 new / i j)
(setq        i -1
        j -1
)
(mapcar '(lambda (x)
             (setq i (1+ i))
             (if (= i n1)
             (mapcar '(lambda        (y)
                          (setq j (1+ j))
                          (if (= j n2) newy)
                        )
                     x
             )
             x
             )
           )
          lst
)
)

fangmin723 发表于 2019-3-20 09:52:44

jack093 发表于 2019-3-20 08:48
你好, subst 使用有些不熟,只会在entmod的时候用,是这样吗?
                (setq ent (entget tem ...

3楼,院长已经帮你写好了,你就用他的把!

jack093 发表于 2019-3-20 11:17:05

用vlax-make-safearray解决
谢谢

jack093 发表于 2019-3-20 12:50:11

非常谢谢院长;写了二十几年的lisp,一直没用过mapcar lambda这两个函数,只会do while for循环,有空了还得学这两个函数,看了躲不过去了,再次谢谢院长!
忙了一上午,以为用vlax-make-safearray可以解决了,真是奇了怪了这两行在命令行好好地
(setq retlst (vlax-make-safearray vlax-vbString '(0 . 50) '(0 . 2)))
(vlax-safearray->list retlst)
在程序中就不工作了



jack093 发表于 2019-3-20 14:58:56

写了一个丑陋的初始化

(defun array-init (n1 n2 val / ret lst)
    (setq lst nil)
    (repeat n2 (setq lst (append lst (list val))))
    (setq ret nil)
    (repeat n1 (setq ret (append ret (list lst))))
    ret
);;(array-init 3 5 nil)

e2002 发表于 2019-3-20 20:12:34

本帖最后由 e2002 于 2019-3-20 20:13 编辑

注意:上面xyp的函数没有对 l,i ,j 的值做检查,实际使用中你需要先做检查,才能保证最后的返回的结果正确。
另外,这种操作效率最高的还是直接使用指针传递,可以直接修改元素的值。

xyp1964 发表于 2019-3-21 13:53:03

e2002 发表于 2019-3-20 20:12
注意:上面xyp的函数没有对 l,i ,j 的值做检查,实际使用中你需要先做检查,才能保证最后的返回的结果正 ...

“要判断 i, j >0 且 i < Length (l) , j < Length (item) ,越界时函数返回值应是nil ”

越界时不修改,返回原表!
页: [1]
查看完整版本: 动态修改表元素