调用过程时可以把数据传递给过程,也可以把过程中的数据传递回来。正确地提供一个过程的输入数据和正确地引用其输出数据,是使用过程的关键问题,也就是调用过程和被调用过程之间的数据传递问题。
7.3.1 形参与实参
1. 形式参数
在通用过程中,出现在 Sub 或 Function 语句中的变量名,是接受数据的变量。
2. 实际参数
在调用 Sub 或 Function 过程时,传送给 Sub 或 Function 过程的常量、变量或表达式。
3. 形式参数和实际参数的对应关系
调用过程: Call exam(18, cj(), ch )
定义过程: Sub exam(r As Integer, a() As Single, c As String)
7.3.2 按地址传递和按值传递
1. 按地址传递参数
按地址传递参数时形式参数和实际参数使用相同的内存地址单元,通过子程序可改变变量的值,在传址调用时,实际参数必须是变量,常量和表达式无法传址。系统缺省按地址传递参数。
例 7 :利用示例 6 中的 Function 过程 Hcf ,求任意两个整数的最大公约数。
程序代码:
Private Sub Command1_Click()
Dim x As Long, y As Long
t = InputBox(" 请输入第一个整数: ")
x = Val(t)
t = InputBox(" 请输入第二个整数: ")
y = Val(t)
If x * y = 0 Then Exit Sub
Label1.Caption = x & "," & y & " 的最大公约数是: " & Str(Hcf(x, y))
Label2.Caption = x & "," & y & " 的最大公约数是: " & Str(Hcf(x, y))
End Sub
执行结果:
2. 按值传递参数
按值传递参数时,传递的只是变量的副本,如果过程改变了这个值,并不影响变量本身。
希望按值传递参数时,可以采用下述两种方法:
◇将变量变成一个表达式,方法是,给变量加上圆括号
示例: (a)
◇在定义过程时,使用关键字 ByVal
示例: Sub fact(ByVal m As Integer)
例 8 :使用传值调用 Function 过程 Hcf ,求两个整数的最大公约数和最小公倍数。
程序代码:
Private Sub Command1_Click()
Dim m As Long, n As Long
t = InputBox(" 请输入第一个整数: ")
m = Val(t)
t = InputBox(" 请输入第二个整数: ")
n = Val(t)
If m * n = 0 Then Exit Sub
Label1.Caption = m & "," & n & " 的最大公约数是: " & Str(Hcf((m), (n)))
Label2.Caption = m & "," & n & " 的最小公倍数是: " & Str(m * n / Hcf((m), (n)))
End Sub
执行结果:
7.3.3 使用参数
1. 使用可选的参数
在过程形参表中列入关键字 Optional ,指定的形式参数为可选参数。此参数后的其他参数也即为可选的,且每个参数都须用 Optional 关键字声明。
例 9 :两个命令按钮的事件代码调用同一个过程,一个传递两个参数,另一个传递一个参数。
程序代码:
Private Sub ListT(x As String, Optional y As String)
Const s = “@@@@@@@@@@”
If IsMissing(y) Then
t = Format(x, s)
Else
t = Format(x, s) & Format(y, s)
End If
List1.AddItem t
End Sub
Private Sub Command1_Click()
Dim a As String, b As String
a = InputBox("", " 第一个参数 ")
b = InputBox("", " 第二个参数 ")
Call ListT(a, b)
End Sub
Private Sub Command2_Click()
Dim a As String
a = InputBox("", " 输入参数 ")
Call ListT(a)
End Sub
执行结果:
2. 提供可选参数的缺省值
例 10 :在例 9 中,为未传递参数指定一个缺省值 "########" 。
只需修改 Sub 过程 ListT 的代码
程序代码:
Private Sub ListT(x As String, Optional y As String = "########")
Const s = "@@@@@@@@@@"
t = Format(x, s) & Format(y, s)
List1.AddItem t
End Sub
执行结果:
3. 使用不定数量的参数
在过程形参表中使用关键字 ParamArray ,则过程可以接受任意个数的参数。
例 11 :改写例 9 的 Sub 过程 ListT ,使之可以接受任意个数的参数。
程序代码:
Private Sub ListT(ParamArray strx())
For Each x In strx
t = t & Format(x, "|@@@@@@")
Next
List1.AddItem t
End Sub
◇传递 3 个参数的命令按钮 Command1 的单击事件代码:
Private Sub Command1_Click()
Dim a As String, b As String, c As String
a = Left(InputBox("", " 第一个参数 "), 6)
b = Left(InputBox("", " 第二个参数 "), 6)
c = Left(InputBox("", " 第三个参数 "), 6)
Call ListT(a, b, c)
End Sub
◇传递 2 个参数的命令按钮 Command2 的单击事件代码:
Private Sub Command2_Click()
Dim a As String, b As String
a = Left(InputBox("", " 第一个参数 "), 6)
b = Left(InputBox("", " 第二个参数 "), 6)
Call ListT(a, b)
End Sub
执行结果:
7.3.4 传递数组
可以将数组或数组元素作为参数进行传递。
说明:
◇数组传递是按地址传递。
◇传递数组时,数组名及后面的圆括号要写全。
◇传递数组元素时,直接写上该数组元素。
例 12 :随机产生 10 个整数,存在数组 a 中,并将数组 a 作为参数,传递到排序过程对其排序。
程序代码:
Private Sub Command2_Click()
p = "": Call pai_xu(a())
For i = 1 To 10
p = p & Str(a(i)) & ","
Next
Label2.Caption = LTrim(Left(p, Len(p) - 1))
End Sub
Sub pai_xu(p() As Integer)
For i = 1 To 9
For j = i + 1 To 10
If p(i) > p(j) Then
t = p(i): p(i) = p(j): p(j) = t
End If
Next
Next
End Sub
执行结果:
|