注册 登录
编程论坛 VB6论坛

初学者-参数传递问题

初学者丶汇云 发布于 2017-12-08 21:18, 3305 次点击
语法不是规定,只要不是常亮和表达式,其默认不是都是地址传递的吗?
下面是一下程序为什么,输出会还是初始值?
只有本站会员才能查看附件,请 登录
在窗体上只建立了一个按钮,为什么调用自定义函数,输出a的值还是0。不是地址传递的吗?
然后在print改成:print a, f(a) 在输出调用自定义函数的时候,a的值会改变,这是为什么?
初学者,谢谢大家回答,我实在想不通。谢谢
12 回复
#2
初学者丶汇云2017-12-08 21:18
在线等
#3
linandceline2017-12-09 09:52
Dim jj As Integer

Private Sub Command1_Click()
Dim a As Integer
cal (a)
Text1 = jj
End Sub

Private Function cal(x As Integer)
jj = 5
End Function
#4
初学者丶汇云2017-12-09 10:46
回复 3楼 linandceline
你好,我想知道为什么按照我的代码改变不了a的值,不是默认地址传递的吗
#5
linandceline2017-12-09 12:00
Dim a As Integer

Private Sub Command1_Click()
Text1 = cal(a)
Text2 = a
End Sub

Private Function cal( x As Integer)
x = 5 * 5
cal = 5
End Function
#6
初学者丶汇云2017-12-09 14:41
回复 5楼 linandceline
谢谢您的回答,您的代码,可以改变a的值,不过我就是想知道为什么我那样调用就不可以,因为以后要考试,所以我想要搞清楚,谢谢
#7
linandceline2017-12-09 14:45
应该是全局变量吧
#8
初学者丶汇云2017-12-09 18:44
回复 7楼 linandceline
什么意思,我没有定义全局变量啊,我说我的代码为什么调用Function过程没有改变a的值,如果是地址传递的话,不是都会改变的吗
#9
风吹过b2017-12-10 17:03
Private Sub Command1_Click()
Dim a As Integer
a = 0
f (a)
Print a

a = 0
f a
Print a

a = 0
Call f(a)
Print a

End Sub

Private Function f%(x As Integer)
x = 5
f = x
End Function


输出 0 5 5
就是
f(a)输出0
f a 输出5 ,与 标准格式 call f(a) 结果相同

结论是  f(a) 与 f a 不相同
我的理解:
f (a) ,这里 (a) 被当做一个表达式处理,先计算这个表达式后得到一个结果,然后这个结果按地址传递给了 函数。函数修改了值,但因为这个参数来自表达式,表达式的结果放在 临时变量里,用完就被丢弃了。
所以 f (a) 调用时,形参的修改,无法 反应到 实参上去。

------MSDN---------------
调用一个过程时,并不一定要使用 Call 关键字。如果使用 Call 关键字来调用一个需要参数的过程,argumentlist 就必须要加上括号。如果省略了 Call 关键字,那么也必须要省略 argumentlis 外面的括号。如果使用 Call 语法来调用内建函数或用户定义函数,则函数的返回值将被丢弃。





[此贴子已经被作者于2017-12-10 19:21编辑过]

#10
linandceline2017-12-11 10:07
回复 9楼 风吹过b
大神,解答一下我的帖子呗
#11
xiangyue05102017-12-11 12:58
你这个代码并没有使用全局变量,a只是在commad1_click中有效, 调用f()函数的时候,实际上是将a的值赋给x, 所以a没有变化。
https://wenku.baidu.com/view/64946525cc7931b764ce1524.html 这个帖子说的比较清晰
#12
wds12017-12-11 22:04
Function f(x As Integer)
Print "2 x", VarPtr(x), x
x = 5
Print "3 x", VarPtr(x), x
Print "4 f", VarPtr(f), f
f = x
Print "5 f", VarPtr(f), f
End Function

Private Sub Command1_Click()
Dim a As Integer
Print "1 a", VarPtr(a), a
Call f(a)  '或者 temp=f(a)  【问题出在这里,函数调用问题,所以地址值没有回传,具体的看打印结果】
Print "6 a", VarPtr(a), a
End Sub
call f(a) 或者 temp=f(a) 地址正确传送
1 a            1635046       0
2 x            1635046       0
3 x            1635046       5
4 f            1634856      
5 f            1634856       5
6 a            1635046       5
f(a) 地址没有传送【调用参数不正确,地址没有传送】
1 a            1635046       0
2 x            1635038       0
3 x            1635038       5
4 f             1634852      
5 f            1634852       5
6 a            1635046       0


[此贴子已经被作者于2017-12-11 22:13编辑过]

#13
肇励影2017-12-14 22:38
dim a as integer
这行代码声明了一个变量a,缺省值是0
下一行中的
f(a)
确实是调用了这个自定义函数,但是没有接收到返回值的变量。
简单点说,就是,在调用结束f之后,f(a)产生的返回值没有赋值给一个变量,所以此时a的值仍然是缺省值,即0。
在之后的语句中,
print a
和上面的代码没有关联,输出的a的值仍然是声明变量a时到的数值,也就是a这个变量的值前后没有改变,即0.。

而对于以地址传递的函数调用来说,我个人是这样理解的:
在f%(x%)中,虽然有
x=5
这样一行代码,但是由于实际参数和形式参数是不同的两个内存地址,也就是这两个变量互不干扰。
我觉得在这个调用过程中,变量地址之间数据的变化应该是这样子的:
=>f(a)
=>x<-a*
(此时x存储的是a的变量地址)
=>x=5
=>x<-5%
(此时x存储的是5,原先a的地址被替换掉了)

所以返回0。

1