明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2498|回复: 12

[已解答] CAD程序为啥乱赋值???

[复制链接]
发表于 2014-10-17 10:43:54 | 显示全部楼层 |阅读模式
两个不相干的变量值,分别在两个不同的子程序里
我用一个计算之后,另一个居然会被赋值
神马原因????
  1. (defun c:f1()
  2.   (setvar "cmdecho" 0)
  3.   (f1_dcl)
  4.   (princ)
  5.   )
  6. (defun f1_dcl()
  7.   (setq dcl_id (load_dialog "C:\\Documents and Settings\\huangtuo\\桌面\\图层LISP源文\\计算.DCL"))
  8.   (new_dialog "f1" dcl_id)
  9.   (action_tile "js_3""(js3)")
  10.   (action_tile "js_1""(js1)")
  11.   (if(not(null r-3)) (set_tile "r_3" (rtos r-3 )))
  12.   (if(not(null kx-3)) (set_tile "kx_3" (rtos kx-3 2 2 )))
  13.   (if(not(null cos-3)) (set_tile "cos_3" (rtos cos-3 2 2)))
  14.   (if(not(null js-r-3)) (set_tile "js_r_3" (rtos js-r-3 2 3)))
  15.   (if(not(null i-3)) (set_tile "i_3" (rtos i-3 2 2)))
  16.   (if(not(null 1.25i-3)) (set_tile "1.25i_3" (rtos 1.25i-3 2 2)))
  17.   (if(not(null r-1)) (set_tile "r_1" (rtos r-1 )))
  18.   (if(not(null kx-1)) (set_tile "kx_1" (rtos kx-1 2 2 )))
  19.   (if(not(null cos-1)) (set_tile "cos_1" (rtos cos-1 2 2)))
  20.   (if(not(null js-r-1)) (set_tile "js_r_1" (rtos js-r-1 2 3)))
  21.   (if(not(null i-1)) (set_tile "i_1" (rtos i-1 2 2)))
  22.   (if(not(null 1.25i-1)) (set_tile "1.25i_1" (rtos 1.25i-1 2 2)))
  23.   (action_tile "accept" "(done_dialog 1)")
  24.   (start_dialog)
  25.   )
  26. (defun js3()
  27.   (setq r-3 (atof (get_tile "r_3")))
  28.   (setq kx-3 (atof (get_tile "kx_3")))
  29.   (setq cos-3 (atof (get_tile "cos_3")))
  30.   (setq js-r-3 (* r-3 kx-3))
  31.   (setq i-3 (/ js-r-3 (* (sqrt 3) cos-3 0.3800)))
  32.   (setq 1.25i-3 (* 1.25 i-3))
  33.   (set_tile "js_r_3" (rtos js-r-3 2 3))
  34.   (set_tile "i_3" (rtos i-3 2 2))
  35.   (set_tile "1.25i_3" (rtos 1.25i-3 2 3))
  36.   )
  37. (defun js1()
  38.   (setq r-1 (atof (get_tile "r_1")))
  39.   (setq kx-1 (atof (get_tile "kx_1")))
  40.   (setq cos-1 (atof (get_tile "cos_1")))
  41.   (setq js-r-1 (* r-1 kx-1))
  42.   (setq i-1 (/ js-r-1 (*  cos-1 0.2200)))
  43.   (setq 1.25i-1 (* 1.25 i-1))
  44.   (set_tile "js_r_1" (rtos js-r-1 2 3))
  45.   (set_tile "i_1" (rtos i-1 2 2))
  46.   (set_tile "1.25i_1" (rtos 1.25i-1 2 3))
  47.   )
上面代码最后一个1.25i_1和1.25i_3这两个值会传值我明明没启动下面的那个js1子程序
但是会被赋值
而且两个变量之间会串值,计算了下面一个1.25i_1会串到上面那个1.25i_3上去
这是神马原因????
附上动态图片演示:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2014-10-17 10:50:34 | 显示全部楼层
程序看不动了,但凭感觉,变量串值就是局部变量和全局变量问题,你的函数全部没有声明局部变量,即所有变量全是全局变量,一个函数对变量赋值,则在所有涉及此变量(名)的地方均被赋值。
建议看看我签名中的《认识自定义函数》。

评分

参与人数 1明经币 +1 收起 理由
lucas_3333 + 1 赞一个!

查看全部评分

 楼主| 发表于 2014-10-17 11:10:50 | 显示全部楼层
ll_j 发表于 2014-10-17 10:50
程序看不动了,但凭感觉,变量串值就是局部变量和全局变量问题,你的函数全部没有声明局部变量,即所有变量 ...

写成全局变量是因为想把对话框内的数据保留下来,因为如果写成局部变量,计算之后值就成nil了
第二次开对话框就没有我上次计算的数据
发表于 2014-10-17 11:22:40 | 显示全部楼层
要保留上一次的数据可以通过读写TXT来实现麽
顺便吐槽下,就一个计算电流,你还整个对话框出来,那还不如直接excel 呢,简单还能保留上次计算数据
 楼主| 发表于 2014-10-17 11:25:56 | 显示全部楼层
伪书虫86 发表于 2014-10-17 11:22
要保留上一次的数据可以通过读写TXT来实现麽
顺便吐槽下,就一个计算电流,你还整个对话框出来,那还不如直 ...

txt操作太复杂了
excel表我也写过,不过那样还得开个程序。追求极致效率
发表于 2014-10-17 11:30:31 | 显示全部楼层
124803430 发表于 2014-10-17 11:25
txt操作太复杂了
excel表我也写过,不过那样还得开个程序。追求极致效率

弱弱的问下,txt比DCL复杂麽?我觉得程序要是自己用的,所有的输入还是放在CAD命令行去输入,效率才能极致,毕竟光自己用,不需要考虑太多的可能性麽,你说是不是呢
发表于 2014-10-17 11:39:23 | 显示全部楼层
124803430 发表于 2014-10-17 11:10
写成全局变量是因为想把对话框内的数据保留下来,因为如果写成局部变量,计算之后值就成nil了
第二次开对 ...

再查查对话框文件的键值。
发表于 2014-10-17 12:15:17 | 显示全部楼层
變量名不要用.
題外,用dcl就別和別人爭辯效率的問題了
发表于 2014-10-17 12:31:53 | 显示全部楼层
问题就出在1.25i_1 1.25i_3这两个变量名称上,LISP会把这两个变量都认作1,所以请去掉点号

评分

参与人数 1明经币 +1 收起 理由
lucas_3333 + 1 赞一个!

查看全部评分

 楼主| 发表于 2014-10-17 13:57:33 | 显示全部楼层
vectra 发表于 2014-10-17 12:31
问题就出在1.25i_1 1.25i_3这两个变量名称上,LISP会把这两个变量都认作1,所以请去掉点号

真如你所说,真不知道cad是如何判别变量名称的~~
明显是两个不一样的名称

点评

这个就是你不规范变量名的后果。  发表于 2014-10-17 14:25
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-24 00:13 , Processed in 0.226587 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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