在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 171|回复: 8

[求助] skill脚本报错问题

[复制链接]
发表于 3 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x
报错行为:

(VAR4)Variables used as both global and local:

                               
登录/注册后可看大图

附上报错原图。
我理解的是全局变量和局部变量的关系,但是我在前面已经定义过了,后面引用下,感觉没啥问题,不知道后面为啥会报错。












发表于 3 天前 | 显示全部楼层
需要在函数头的位置将局部变量包含在 let() 语句中,才算是局部变量。在函数外如果也定义了同样的全局变量的话,就会confusing,但我不知道为啥Lint会报这个错,要看更多的代码才知道。
 楼主| 发表于 前天 09:29 | 显示全部楼层


amodaman 发表于 2025-7-9 19:26
需要在函数头的位置将局部变量包含在 let() 语句中,才算是局部变量。在函数外如果也定义了同样的全局变量 ...


刚刚看了一下整体函数,含有width的子函数没有定义这个局部变量,而另外一个子函数却定义了width局部变量,但他们两个子函数都是分开run的。
 楼主| 发表于 前天 09:31 | 显示全部楼层


amodaman 发表于 2025-7-9 19:26
需要在函数头的位置将局部变量包含在 let() 语句中,才算是局部变量。在函数外如果也定义了同样的全局变量 ...



                               
登录/注册后可看大图
这是那个部分函数的原图。
发表于 前天 09:44 | 显示全部楼层


icyyds 发表于 2025-7-10 09:29
刚刚看了一下整体函数,含有width的子函数没有定义这个局部变量,而另外一个子函数却定义了width局部变量 ...


width这种变量名太普通了,任何一个GUI item都会有width变量来做定义,所以如果相互覆盖的话,代码就会很乱。还好没报错“试图改写一个受保护的变量”,那就是前面的代码中还没有出现特意保护这个变量名的。最简单的处理就是换一个变量名,比如 width_xxx 。
 楼主| 发表于 前天 09:50 | 显示全部楼层


amodaman 发表于 2025-7-10 09:44
width这种变量名太普通了,任何一个GUI item都会有width变量来做定义,所以如果相互覆盖的话,代码就会很 ...


好的,我试着在width后面加上后缀看看。

 楼主| 发表于 前天 10:10 | 显示全部楼层


amodaman 发表于 2025-7-10 09:44
width这种变量名太普通了,任何一个GUI item都会有width变量来做定义,所以如果相互覆盖的话,代码就会很 ...


你好,还在吗?就是原先那个报错图片中那几个cutHeight、cutWidth那几个变量名的问题,我看了下函数整体结构,子函数也是放在最上面的开头部分,没有定义cut_xxx这几个变量名。而main函数放在中间的部分,都定义了cut_xxx这几个变量名。

那我是应该在主函数中将那几个用在子函数上变量名cut到子函数上的let里或者是说将子函数的run的顺序改下,放在main函数 下面呀。
发表于 前天 12:56 | 显示全部楼层
1)建议你看一下let()函数的描述,里面对局部变量的作用域有清晰地描述。
2)与其将变量名放置在某个局部作用域来让它起作用,不如将局部变量放在调用函数的变量列表里面,从函数外部代入进来,这样调用的关系就最清晰。




  1. procedure( fun1(A B C)
  2. let ( (A1 B1 C1)
  3. A1 =A+1
  4. B1 =B+2
  5. C1 =C+3
  6. list(A1 B1 C1)
  7. ) ;; let
  8. ) ;; procedure fun1

  9. procedure( main()
  10. let( (A0 B0 C0 A2 B2 C2 List2)
  11. A0=0
  12. B0=0
  13. C0=0
  14. List2 = fun1(A0 B0 C0)
  15. A2 = car(List2)
  16. B2 = cadr(List2)
  17. C2 = caddr(List2)
  18. list(A2 B2 C2)
  19. ) ;; let
  20. ) procedure main



复制代码

顶层调用 main(), My_List = main(), 于是得到 My_List=list(1 2 3)
 楼主| 发表于 前天 15:17 | 显示全部楼层


amodaman 发表于 2025-7-10 12:56
1)建议你看一下let()函数的描述,里面对局部变量的作用域有清晰地描述。
2)与其将变量名放置在某个局部作 ...


好的,我等下试下。

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

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-7-12 21:12 , Processed in 0.037066 second(s), 7 queries , Gzip On, MemCached On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表