乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 19|回复: 7

[编程交流] 跟踪变量有趣

[复制链接]

15

主题

65

帖子

50

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
75
发表于 2022-7-6 12:51:36 | 显示全部楼层 |阅读模式
我已经设法让我的程序的基础工作得很好,现在我知道我不是在浪费时间
 
很明显,我需要跟踪许多变量,并不仅在各种函数中使用它们,而且最好每天都使用。
 
所以我想我需要开始把东西写进文件。
 
这是正确的反应,还是我只是在要求很多痛苦?
 
谢谢
 
安得烈
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 13:07:48 | 显示全部楼层
变量应该是函数的局部变量,在函数完成后,您不需要担心它们。
 
这是你应该注意的全局变量
回复

使用道具 举报

15

主题

65

帖子

50

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
75
发表于 2022-7-6 13:13:32 | 显示全部楼层
 
我认为我脑子里想全局变量的最大问题是我不知道它们是在哪里声明的。。
 
我可以直接设定,只要它不是局部的,它就是全局的,对吗?
 
当我关闭图形并重新加载它时怎么样?
 
我知道的基本情况。。但出于某种原因,我在这里没有得到什么
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 13:18:36 | 显示全部楼层
不久前,我写了一篇关于局部变量的教程,但它还没有得到董事会的批准
 
这是复制/粘贴版本:
 
(defun cxx…)后面的括号的用途是什么?
 
这是许多人第一次开始用LISP编写代码时都会遇到的一个问题,这个问题有很多不确定性。
 
“德方”的一些背景
 
启动AutoCAD并在命令行中键入VLIDE以打开Visual LISP编辑器。转到“文件”>“新建文件”,然后键入“defun”。文本将变为蓝色,表示编辑器将其识别为函数。双击该功能并单击工具栏上的帮助图标(米色语音泡泡)。
 
这将在“defun”函数上显示VLA帮助。
 
阅读帮助文章时,请注意括号的用途:在“/”之前的所有内容都是参数(程序运行所需的数据),在它之后的所有内容都是变量(一个绑定了值的符号)。
 
注意:参数必须在这些括号内声明,否则程序将停止运行。参数是用于表示输入数据的符号,用户必须提供这些数据才能执行函数。
 
但是,如果函数没有参数(从命令行调用的大多数函数(如果不是全部)没有参数),则代码可以在defun旁边有一组空括号。但这样做有一定的意义。
 
为什么使用括号?
 
 
这种做法被称为“局部”变量(基本上是因为当在括号内时,变量被称为“局部变量”,而不是“全局变量”)
 
当定位变量时,它被声明为函数的变量,并且在函数完成后,绑定到它的任何值都将设置为零,因此变量现在将仅成为一个符号。
 
为什么这很重要?
 
 
有很多要点:
 
假设两个函数使用相同的符号来表示变量。在函数完成后,在没有声明任何变量的情况下,变量仍保留其值-直到重新定义-它们可能不是。这可能会导致各种问题,因为第一个程序的值可能会无意中用于第二个程序。
 
另一个主要问题发生在函数和变量内循环引用自身时。
 
以这段代码为例:
 
上面是一个简单的代码,用于说明变量的本地化点。它将依次获取列表中的每个数字:(1、2、3、4、5),并仅将其添加到累积列表中。
 
因此,我们预计反转列表会返回(为什么会反转?):
 
这应该是返回的。
 
现在再次运行代码。。。
 
我们收到结果:
 
这是函数完成后变量“aList”保持其值的位置。因此,当重新调用该函数时,列表中的数字将添加到已填充的输出列表中。这不是我们想要的结果,因为它是不一致的。
 
现在,请尝试以下代码:
第二次运行上述程序时,请注意每次返回的结果都是相同的,因此我们可以依赖程序的一致性。
 
全局变量
 
 
有时,希望变量在绘图过程中保持其值,例如,每次调用时存储程序的默认选项。这些被称为“全局变量”,不应包含在函数定义(defun)旁边的括号中。
 
然而,如上所述,这些函数可能会与使用相同符号定义变量的其他函数发生冲突,因此如果变量名是原始的(可能使用分号,以函数名作为前缀),则效果更好,因此复制的可能性很小(见下例):
 
下面是使用全局变量的示例代码:
 
包含函数“vl princ to string”的短语只是提醒变量的值(只是为了说明一点)。
 
用上面的代码进行实验,反复调用几次,就会看到全局变量的效果。
 
但是,请注意,变量“temp”仍然位于函数定义后的括号内,因为它仍然是局部变量。此外,全局变量定义为glob:def,使用函数名glob作为前缀和任意后缀。
 
这几乎涵盖了关于局部和全局变量的大部分信息,但是如果你有任何进一步的问题,只要在论坛上发布一条帖子,我们将非常乐意提供帮助。
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2022-7-6 13:28:20 | 显示全部楼层
你好
 
我使用存储数据的方式取决于其可访问性:
在一次会议期间
-函数内:局部变量(setq函数)
-图形内:全局变量(setq函数)
-将数据填充到每个打开的文档:vl传播或使用黑板(vl bbset/vl bbref)
 
-在图形中:ldatas、xdatas、xrecords、dictionary(用于ldatas的vlax ldata*函数、用于其他的entmod或vla-*函数)-必须从任何图形中访问的数据可以存储在注册表中(setenv/getenv或vl registry*函数)
回复

使用道具 举报

4

主题

327

帖子

324

银币

初来乍到

Rank: 1

铜币
19
发表于 2022-7-6 13:35:52 | 显示全部楼层
您应该学习将数据写入文件、扩展数据、xrecord注册表中心的所有不同方法,然后确定哪种方法最适合您的程序需要。
首先,当程序结束时,所有变量都需要为零,以防止它们干扰其他程序中的其他变量。
如果你学会将数据写入其他位置,你就不需要担心全局变量,尽管我承认它们有一个位置和时间。
我建议您花一些时间创建一个lisp文件,仅用于写入和读取数据,然后在编译到vlx时只包含该文件。
我有一个文件,它具有各种功能,可以写入不同的位置。
用参数设置每个函数,以接收数据文件名和路径或函数所需的任何内容。在程序中,只需调用传递信息的函数,如(setq wf(my\u writefile data filename path))调用名为my\u writefile的函数,并向其传递3条数据。然后在my_writefile函数的末尾,让它传回一些信息,告诉您该函数是否成功,以便您可以相应地处理它。
将这些函数设置在一个单独的文件中,将为您节省大量使用其他需要它们的程序的时间。
回复

使用道具 举报

15

主题

209

帖子

121

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
163
发表于 2022-7-6 13:47:39 | 显示全部楼层
看看这个主题:
 
http://www.theswamp.org/index.php?topic=1445.msg18109#msg18109
 
下载atoms家庭浏览器(谢谢Micheal)
 
在新的会话中运行程序,然后运行浏览器,这将帮助您确定在无人值守的情况下漂浮在那里的内容。对于开发人员来说,这是一个很棒的工具,尤其是当您有一个需要对变量进行严格监控的大型程序时。。。。
 
将所有支票发送给Micheal。。。。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 13:57:05 | 显示全部楼层
很好,提姆,我也这么认为
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-5 03:00 , Processed in 0.631654 second(s), 68 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表