明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1554|回复: 10

[已解答] 主程序正常但改为子函数后不能返回值

[复制链接]
发表于 2015-9-22 12:47:14 | 显示全部楼层 |阅读模式
本帖最后由 czcxxx 于 2015-9-30 13:08 编辑

主程序正常运行,能获得想要的值,但改为子函数后返回值为NIL

当作主程序时的代码如下:
  1. (defun bat_la (ss_mod  ii / x)
  2.   (mapcar
  3.     '(lambda (x) (cdr (assoc ii (entget x))))
  4.     (vl-remove-if
  5.       'listp
  6.       (mapcar 'cadr (ssnamex ss_mod))
  7.     )
  8.   )
  9. );;;;取关联表单项值


  10.   (PRINT "\n请选择两个具有部分相同内容的单行文字:")
  11.   (setq ss1 (ssget '((0 . "text"))))
  12.   (WHILE (/= (sslength ss1) 2)
  13.     (PRINT "\n请选择两个具有部分相同内容的单行文字:")
  14.     (setq ss1 (ssget '((0 . "text"))))
  15.   )
  16.   (setq tl_t (bat_la ss1 1))
  17.   (setq pos1 (getint "\n请选择相同内容的起始位置:<0>"))
  18.   (if (null pos1)
  19.     (setq pos1 0)
  20.   )
  21.   (setq str1 (car tl_t))
  22.   (if (setq leng1 (vl-string-mismatch str1 (cadr tl_t) pos1 pos1 t))
  23.     (setq strsub (substr str1 (+ 1 pos1) leng1))
  24.     (setq sstr (strcat "*" strsub "*"))
  25.   )
  26.   (setq sstr sstr)
sstr的值正常可得

当将主程序改为子函数后,再调用返回值为NIL

将主程序改为子函数并调用的代码如下:
  1. (defun bat_la (ss_mod  ii / x)
  2.   (mapcar
  3.     '(lambda (x) (cdr (assoc ii (entget x))))
  4.     (vl-remove-if
  5.       'listp
  6.       (mapcar 'cadr (ssnamex ss_mod))
  7.     )
  8.   )
  9. );;;;取关联表单项值

  10. (defun czc_eqt ( / ss1 tl_t pos1 str1 leng1 strsub sstr)
  11.   (PRINT "\n请选择两个具有部分相同内容的单行文字:")
  12.   (setq ss1 (ssget '((0 . "text"))))
  13.   (WHILE (/= (sslength ss1) 2)
  14.     (PRINT "\n请选择两个具有部分相同内容的单行文字:")
  15.     (setq ss1 (ssget '((0 . "text"))))
  16.   )
  17.   (setq tl_t (bat_la ss1 1))
  18.   (setq pos1 (getint "\n请选择相同内容的起始位置:<0>"))
  19.   (if (null pos1)
  20.     (setq pos1 0)
  21.   )
  22.   (setq str1 (car tl_t))
  23.   (if (setq leng1 (vl-string-mismatch str1 (cadr tl_t) pos1 pos1 t))
  24.     (setq strsub (substr str1 (+ 1 pos1) leng1))
  25.     (setq sstr (strcat "*" strsub "*"))
  26.   )
  27.   (setq sstr sstr)
  28. )
  29. (czc_eqt)
返回值为NIL,想不明白!!!
请高手给看看!!
谢谢!!
发表于 2015-9-22 13:07:49 | 显示全部楼层
(defun czc_eqt ( / ss1 tl_t pos1 str1 leng1 strsub sstr)
  (PRINT "\n请选择两个具有部分相同内容的单行文字:")
  (setq ss1 (ssget '((0 . "text"))))
  (WHILE (/= (sslength ss1) 2)
    (PRINT "\n请选择两个具有部分相同内容的单行文字:")
    (setq ss1 (ssget '((0 . "text"))))
  )
  (setq tl_t (bat_la ss1 1))
  (setq pos1 (getint "\n请选择相同内容的起始位置:<0>"))
  (if (null pos1)
    (setq pos1 0)
  )
  (setq str1 (car tl_t))
  (if (setq leng1 (vl-string-mismatch str1 (cadr tl_t) pos1 pos1 t))
    (setq strsub (substr str1 (+ 1 pos1) leng1))
    (setq sstr (strcat "*" strsub "*"))
  )
  (setq sstr sstr)
  sstr
)
或者把sstr作为全局变量使用
发表于 2015-9-22 13:08:50 | 显示全部楼层
(if (setq leng1 (vl-string-mismatch str1 (cadr tl_t) pos1 pos1 t))
    (setq strsub (substr str1 (+ 1 pos1) leng1))
    (setq sstr (strcat "*" strsub "*"))
  )
有问题,当(setq leng1 (vl-string-mismatch str1 (cadr tl_t) pos1 pos1 t))成立时,没有计算sstr,所以就是nil了,不成立时,strsub没有赋值,估计也会报错。
看程序的意思,应该不用这个if判断,直接三行赋值。
    (setq leng1 (vl-string-mismatch str1 (cadr tl_t) pos1 pos1 t))
    (setq strsub (substr str1 (+ 1 pos1) leng1))
    (setq sstr (strcat "*" strsub "*"))

 楼主| 发表于 2015-9-22 14:04:22 | 显示全部楼层
谢谢mmmmmm 及chg !
(if (setq leng1 (vl-string-mismatch str1 (cadr tl_t) pos1 pos1 t))
     (setq strsub (substr str1 (+ 1 pos1) leng1))
     (setq sstr (strcat "*" strsub "*"))
   )
这段代码确实有问题。
应为
(if (setq leng1 (vl-string-mismatch str1 (cadr tl_t) pos1 pos1 t))
    (progn
      (setq strsub (substr str1 (+ 1 pos1) leng1))
      (setq sstr (strcat "*" strsub "*"))
    )
  )

谢谢两位的答复!!
当作主程序时代码原为
    (setq leng1 (vl-string-mismatch str1 (cadr tl_t) pos1 pos1 t))
     (setq strsub (substr str1 (+ 1 pos1) leng1))
     (setq sstr (strcat "*" strsub "*"))
改为子函数后为了安全加了个IF 限制
不认真,没有加全,麻烦不断!!
教训啊!!!!!!!!!!
发表于 2015-9-22 16:33:25 | 显示全部楼层
楼主的程序不错,可惜不支持“中文”。
 楼主| 发表于 2015-9-23 09:30:43 | 显示全部楼层
本帖最后由 czcxxx 于 2015-9-23 09:45 编辑

USER2128 老师,不支持“中文”中的“中文”指的是什么?
这个子程序就是用于批量删除不想要的中文文字的子函数

当然英文也可以
发表于 2015-9-23 10:16:54 | 显示全部楼层
本帖最后由 llsheng_73 于 2015-9-23 10:18 编辑

两个文本的相同部分应该由程序求出:包括其起始位置,不然程序的作用大打折扣,甚至可以考虑支持MTEXT
 楼主| 发表于 2015-9-23 17:18:15 | 显示全部楼层
感谢xianaihua 让我知道汉字字符串是如何获取的!!
http://bbs.mjtd.com/thread-111852-1-1.html
感谢llsheng_73 的建议!!!
两个文本的相同部分应该由程序求出仍可用(vl-string-mismatch str1 str2 [pos1 pos2 ignore-case-p])完成
包括位置,不用将汉字字符串分割。
谢谢各位!!!
发表于 2015-9-24 09:59:28 | 显示全部楼层
比如:
(vl-string-mismatch  "边梁"     "中梁"  0 0 t) ; ==> 4
(vl-string-mismatch "A边梁BCD" "A中梁B" 0 0 t) ; ==> 6
(vl-string-mismatch "A边梁BCD" "A中梁B" 1 1 t) ; ==> 5
(vl-string-mismatch "A边梁BCD" "A中梁B" 2 2 t) ; ==> 4
 楼主| 发表于 2015-9-24 11:22:57 | 显示全部楼层
本帖最后由 czcxxx 于 2015-9-24 11:59 编辑

首先:谢谢USER2128 !

测试确实如此!!
(vl-string-mismatch  "边梁"     "中梁"  0 0 t) ; ==> 4
(vl-string-mismatch "A边梁BCD" "A中梁B" 0 0 t) ; ==> 6
(vl-string-mismatch "A边梁BCD" "A中梁B" 1 1 t) ; ==> 5
(vl-string-mismatch "A边梁BCD" "A中梁B" 2 2 t) ; ==> 4
改变一下正确:
(vl-string-mismatch  "边梁"        "中梁"  0 0 ) ; ==> 0
(vl-string-mismatch  "边梁"        "中梁"  2 2 ) ; ==>2
(vl-string-mismatch  "边梁"        "中梁"  3 3 ) ; ==>1
(vl-string-mismatch "A边梁BCD" "A中梁B" 0 0 ) ; ==> 1
(vl-string-mismatch "A边梁BCD" "A中梁B" 1 1 ) ; ==> 0
(vl-string-mismatch "A边梁BCD" "A中梁B" 2 2 ) ; ==> 0
(vl-string-mismatch "A边梁BCD" "A中梁B" 3 3 ) ; ==> 3
(vl-string-mismatch "A边梁BCD" "A中梁B" 4 4 ) ; ==> 2
(vl-string-mismatch "A边梁BCD" "A中梁B" 5 5 ) ; ==> 1
(vl-string-mismatch "A边梁BCD" "A中梁B" 6 6 ) ; ==> 0
ASCII如下:
vl-string->list "边梁")
(177 223 193 186)
_$ (vl-string->list "中梁")
(214 208 193 186)
_$ (vl-string->list "A边梁BCD")
(65 177 223 193 186 66 67 68)
_$ (vl-string->list "A中梁B")
(65 214 208 193 186 66)
_$
看来vl-string-mismatch 按ascii码为基础进行单字节比较的,
即使单字节比较也能得到正确结果,当然有字符被分割的情况,但要找出来正确的!!


若分割汉字(含英文)字符串成表,要两层循环,并加个表处理也可找到最大相同部分及起始位置。

很有些麻烦!


区分大小写究竟发生了什么?
或者说对于汉字所谓的大小写的区别是什么???
高手们请指教!!!
谢谢!!!

评分

参与人数 1明经币 +1 收起 理由
USER2128 + 1 淡定

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-19 05:46 , Processed in 0.156135 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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