找回密码
 加入
搜索
查看: 12972|回复: 21

[AU3基础] 关于变量作用域的几个疑问

 火... [复制链接]
发表于 2012-9-23 12:26:18 | 显示全部楼层 |阅读模式
1.其他语言会有一个main函数,main函数之外定义的是全局变量,autoit没有main函数,是不是函数之外的变量就是全局变量?

2.如果是,那么函数之外的dim、local、global,有什么区别?在函数之外的dim、local是否也是全局变量?

3.其他语言全局变量和局部变量作用域重合的时候,起作用的是局部变量,autoit是否也是这种情况(测试结果为是)?这个问题的原因是,帮助上说,“Dim = 如果同名的全局变量不存在,则作用域为局部(如果已有同名的全局变量存在则将复用该变量!)”,这句话我没看明白到底是个啥意思。

4.“在同一作用域内以一个简单的值声明一个变量,不会修改变量的值”,帮助里的这句话是什么意思?

5.autoit函数形参是不是值传递?

6.“如果你声明一个与参数同名的变量, 当函数内部使用 Local 时将出现错误”,这句话是什么意思?

非常感谢,让各位大牛见笑了,呵呵。

帮助说应该少用dim,我感觉是这样,感觉没把dim完全吃透。

评分

参与人数 1金钱 +20 收起 理由
oxygen + 20 精品文章

查看全部评分

发表于 2012-9-23 13:29:01 | 显示全部楼层
1.你所写的代码就是  MAIN 也就是说这不需要写 MAIN
2.帮助里面有详细说明(帮助里面收  其中的一个就可以看到)
3.建议尽量使用 其它两个申明,一个全局,一个局部。这样比较易读易写易修改。
   DIM 自己没用过。。
4.这个意思就是说你申明的  是一个常量,不可以修改的量
   常量     Const $a = 2
               $a = 2  (不能执行)
    变量  dim、local、global(其中一个)   $a = 3
                $a =5   (可以执行)
5.形参 是什么  我不知道   但是  函数  可以  有  参数,返回值
6.这个也不知道,不要使用同名变量就是了   比如:$a,$a1,$a2......这样就避免同名了    没有同名也就没有后面的那么多了
PS:  以上仅   小弟个人愚见   还请前辈们指正

评分

参与人数 1金钱 +15 收起 理由
annybaby + 15

查看全部评分

发表于 2012-9-23 14:34:36 | 显示全部楼层
1.其他语言会有一个main函数,main函数之外定义的是全局变量,autoit没有main函数,是不是函数之外的变量就是全局变量?

/*可以这么认为,函数之外声明的变量都能被其他函数访问,无论 local 或者 global。*/

2.如果是,那么函数之外的dim、local、global,有什么区别?在函数之外的dim、local是否也是全局变量?

/*函数之外,dim可以声明成不确定的有效范围,有可能是 local 也有可能是 global,这个视函数的作用域.*/

3.其他语言全局变量和局部变量作用域重合的时候,起作用的是局部变量,autoit是否也是这种情况(测试结果为是)?这个问题的原因是,帮助上说,“Dim = 如果同名的全局变量不存在,则作用域为局部(如果已有同名的全局变量存在则将复用该变量!)”,这句话我没看明白到底是个啥意思。

/*在全局变量和局部变量重合是,局部变量优先。dim上面说过,他是不确定的声明类型,视作用范围可以声明成local或者 global
上面这句,如果没用同名的全局变量,那么这个dim将声明成局部变量,如果有全局的变量,那么dim声明的变量也作为局部变量,只是名字相同了*/

4.“在同一作用域内以一个简单的值声明一个变量,不会修改变量的值”,帮助里的这句话是什么意思?

/*这句的意思就是用一个常量声明一个变量,常量不是会改变的。*/


5.autoit函数形参是不是值传递?

/*autoit参考的是C语言,形参也是值传递的,用了那么久不知道怎么传址,当然我只是菜鸟阶段*/

6.“如果你声明一个与参数同名的变量, 当函数内部使用 Local 时将出现错误”,这句话是什么意思?
/*函数的形参是一个局部变量,如果函数范围内用local将重复声明一个局部变量.*/

非常感谢,让各位大牛见笑了,呵呵。

帮助说应该少用dim,我感觉是这样,感觉没把dim完全吃透。

评分

参与人数 1金钱 +15 收起 理由
annybaby + 15 感谢分享经验

查看全部评分

发表于 2012-9-23 15:41:19 | 显示全部楼层
回复 1# zcsgamer


   楼上已经有不少好回答, 我根据自己体验补充一点:

有关第3个问题, 实例体会吧:
Dim $n = 5
_myfunc()
MsgBox(0, 'main', $n)
Func _myfunc()
        Dim $n ; 这里没有赋值, 沿用了全局变量...
        $n += 1
        MsgBox(0, 'myfunc', $n)
EndFunc
问题5: 请参考 ByRef 的帮助信息

问题6: 其错误类似于
Dim $n = 5
_myfunc($n)
Func _myfunc($n)
        local $n ; 这里将出错...
;....
EndFunc

评分

参与人数 1金钱 +10 收起 理由
annybaby + 10 感谢分享经验

查看全部评分

发表于 2012-9-23 16:08:21 | 显示全部楼层
感谢楼上几位的经验分享,我捣鼓了一下,发觉问题多多,比如,为什么这个测试程序会出错呢??

_test()

MsgBox(0,'外面的',$a)

Func _test()
Global $a=1
$a+=666666666666
MsgBox(0,'来自自定义函数内',$a)
EndFunc


按理说,自定义函数内部已经将变量$a强制转成全局的,为什么在外面无法引用??


"E:\桌面\code\au3.au3"(35,21) : warning: $a: 使用前并未进行声明.
MsgBox(0,'外面的',$a)
~~~~~~~~~~~~~~~~~~~~^
E:\桌面\code\au3.au3 - 0 错误, 1 警告
istics;


但将,自定义函数的位置和外面的信息框位置换一下就可以了~~,郁闷~~
发表于 2012-9-23 16:14:12 | 显示全部楼层
回复 5# annybaby

AU3程序的编译与执行是按顺序进行的, 这就是出错与" 自定义函数的位置和外面的信息框位置换一下就可以了" 的原因
发表于 2012-9-23 16:56:43 | 显示全部楼层
回复 6# user3000

你前部分说的明显是事实,但实话说,我很难同意你这个观点(因为它没有解释:为什么会报错)

更多的测试表明,事实是:程序是可完全正确地执行,数据也是正确的,只是检查的程序是从顺序检查的,所以在检查时报错了~~继续执行没有问题~~
 楼主| 发表于 2012-9-23 17:13:05 | 显示全部楼层
回复 7# annybaby


    你的那段代码我这里可以正常运行,没报错。
 楼主| 发表于 2012-9-23 17:17:17 | 显示全部楼层
感谢各位大牛,明白了不少,但还有两个问题:
1.函数外部的global与local是否完全一样,还是有什么区别?
2.dim这种声明方式有何不可替代之处,既然有global和local了,autoit为什么还要有dim存在?
发表于 2012-9-23 17:19:16 | 显示全部楼层
回复 7# annybaby

好吧, 我话说得不够详细. 你程序本身实质上是没问题, 但 au3check 的检查工作是按代码一行一行进行的, 比如你那个小程序:
第一行  _test() , 它就会检查是否程序中已经定义有这样的一个函数, 但此时还不会检查此函数的语法详细情况!
第二行, 它接着检查  MsgBox(0,'外面的',$a), 它就会认为变量a没有定义过, 于是给出了报错提示, 并停止工作~! 尽管你在后面的函数中是有相关定义, 但它明显没那么智能地知道去检查后面的代码, 或者说作者未赋予它此智能?此问题, 在论坛上已有相关讨论的帖子, 但我记性差, 这里就无法具体的例出...

评分

参与人数 1金钱 +10 收起 理由
oxygen + 10 厉害、佩服

查看全部评分

发表于 2012-9-23 22:42:37 | 显示全部楼层
本帖最后由 xms77 于 2012-9-23 22:44 编辑

回复 9# zcsgamer
5.autoit函数形参是不是值传递?
传址:
func _xxx(ByRef $a)
...
endfunc

传值:
func _xxx($a)
...
endfunc
发表于 2012-9-23 23:28:03 | 显示全部楼层
回复 7# annybaby


    报错的,没有声明的变量(以编译的角度为准)使用就会报错
    有图有真相:

本帖子中包含更多资源

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

×
发表于 2012-9-23 23:42:44 | 显示全部楼层
回复 12# 魔导

程序是没有错的,这个报错我前面已经说了(其实你前面也已经有说)
请注意看这个图的标题:
au3check
是检查,你不管它,直接运行可以,编译后运行也可以~~

所以说,程序"本身"没有错,只是检查器"以为"它错了,因为还不够智能~~

评分

参与人数 1金钱 +10 收起 理由
oxygen + 10 厉害、佩服

查看全部评分

发表于 2012-9-24 09:49:13 | 显示全部楼层
回复 11# xms77


这个跟9#的问题有什么关系吗?
话说我一直也有类似疑问。总觉得local和global在函数外是等同的。
即使多文件的情况,local定义的变量也能在其他文件中使用。因为include是会展开的,展开后相当于在一个文件内。
发表于 2012-9-24 13:33:29 | 显示全部楼层
回复 14# xiehuahere

这个跟9#的确没有啥关系,只是我和魔导进行一些有益的探讨~


在一个程序里,global和local在函数外是一样的(或者说,我个人没有发现显著区别),这只是因为没有办法跟到这个程序的"更外面",但是当你将一个程序作为一个UDF使用时,这个原来在"函数外面定义"的变量就会变成了主程序里的一个自定义函数"里面的变量"就显然会有区别了~~
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-15 17:27 , Processed in 0.107280 second(s), 33 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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