51Testing软件测试论坛

标题: ByVal与ByRef [打印本页]

作者: 木卫十二    时间: 2007-8-21 17:44
标题: ByVal与ByRef
pa = 1
Fun(pa)
msgbox pa,,"pa"

Function Fun(byRef para)
        para = para +1
       msgbox para,,"para"
End Function


本以为pa的值将会变为2,可是结果没有。。。
pa的值都没变。
ByVal与ByRef运行结果相同!错在哪里吖?
那要如何才能实现按地址传递呢?
作者: 风过无息    时间: 2007-8-21 17:52
看我的博客里有
作者: yuandjing    时间: 2007-8-21 18:00
不会啊
比如说
Public Sub swap(byref a,byref b)
        Dim c
        c = a
        a = b
        b = c
End Sub

调用它:
dim x,y
x = 1
y = 2
call swap(x,y)
msgbox x  '为 2
msgbox y  '为 1

[ 本帖最后由 yuandjing 于 2007-8-21 18:02 编辑 ]
作者: 木卫十二    时间: 2007-8-21 18:09
对比风版主以及楼上的文章,终于找到了原因!竟然是调用function时必须用Call Fun(pa)。没想到Call还有这个用处,看来还得认真看帮助啊!要学的地方还太多啊!sdlkfj5
谢谢两位的回答!sdlkfj6
作者: danmy    时间: 2007-8-21 18:55
好像byref 用来作输出吧
作者: xuehuiyiwang    时间: 2007-8-21 22:16
我的理解是: 对于function来说,如果要用call,则必须将参数扩起来; 如果不用call,则一定不能将参数扩起来。所有lz的调用语句:
Fun(pa)
是不合法的。
作者: yabest    时间: 2007-8-21 22:50
原帖由 xuehuiyiwang 于 2007-8-21 22:16 发表
我的理解是: 对于function来说,如果要用call,则必须将参数扩起来; 如果不用call,则一定不能将参数扩起来。所有lz的调用语句:
Fun(pa)
是不合法的。


说的不够全面!

需要将参数括起来的情况包括:
1、call FuncName(a)   ‘用 Call
2、ret = FuncName(a) '返回值付给变量
3、if FuncName(a) > 0 then '返回值参与比较

不需要将参数括起来的情况
FuncName a
作者: walker1020    时间: 2007-8-22 00:38
如果有开发经验,就很容易明白这些了
作者: 木卫十二    时间: 2007-8-22 09:21
以前还真没注意到这些!只以为script语言没那么严格,随便拿来就用。学习了!谢谢各位的回答!sdlkfj3
作者: marco    时间: 2007-8-22 09:45
原帖由 yabest 于 2007-8-21 22:50 发表


说的不够全面!

需要将参数括起来的情况包括:
1、call FuncName(a)   ‘用 Call
2、ret = FuncName(a) '返回值付给变量
3、if FuncName(a) > 0 then '返回值参与比较

不需要将参数括起来的情况
...


恩,总结的很全面
我再总结下
就是用call 的时候要加括弧
还有就是要取他的返回值的时候要用括弧
作者: rivermen    时间: 2007-8-22 09:50
调用函数时,参数传递有“传值”和“传地址”之分
原来这里有类似的




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2