今天在上課,給學生講到了access2010中過程的調用,在印象中見過的access2010的材料都提到:過程的調用call是可以省略的??稍谏险n時就出現的問題了?。?!
一、 情境再現
在講解過程的作用之一:可以減少代碼的重復提高共享效率。用了下面這段代碼:
Private Sub numSort()
'產生20個[0,100]之間的整型隨機數
Dim n(1 To 20) As Integer
Dim i As Integer
For i = 1 To 20
Randomize
n(i) = Rnd() * 101
Next
'打印排序前隨機數
Dim outString As String
outString = "排序前隨機數:"
For i = 1 To 20
outString = outString & Str(n(i)) & " "
Next
Debug.Print outString
'排序
Dim temp As Integer
Dim j As Integer
For i = 1 To 20
For j = i To 20
If (n(i) > n(j)) Then
temp = n(i)
n(i) = n(j)
n(j) = temp
End If
Next
Next
'打印排序后隨機數
outString = "排序后隨機數:"
For i = 1 To 20
outString = outString & Str(n(i)) & " "
Next
Debug.Print outString
End Sub
例題的目的是:產生20個隨機數存于數組,數組打印出來,對20個隨機數從小到大排序,數組再打印出來。
這里面用到了兩次的數組打印,兩段代碼有共同性,可以提練成一個過程從而減少代碼、提高代碼復用率。于是在課堂上開始給學生修改代碼了(原本以為是簡單的事,事前沒有先驗證,結果笑話了….@~)。修改后的代碼如下:
Private Sub numSort()
'產生20個[0,100]之間的整型隨機數
Dim n(1 To 20) As Integer
Dim i As Integer
For i = 1 To 20
Randomize
n(i) = Rnd() * 101
Next
'打印排序前隨機數
printArr("排序前的隨機數:",n)
'排序
Dim temp As Integer
Dim j As Integer
For i = 1 To 20
For j = i To 20
If (n(i) > n(j)) Then
temp = n(i)
n(i) = n(j)
n(j) = temp
End If
Next
Next
'打印排序后隨機數
End Sub
Private Sub printArr(s As String, k() As Integer)
Dim outString As String
outString = s
Dim i As Integer
For i = LBound(k) To UBound(k)
outString = outString & Str(k(i)) & " "
Next
Debug.Print outString
End Sub
在定義好printArr過程,要調用時使用不帶call的調用,悲劇的事情發生了,給出如下提示:
明顯printArr("排序前的隨機數:",n)這個語句出問題了??墒窃趺纯磸恼Z法上都沒有問題(唉…這就是治學不嚴的后果,謹記,切記,以后不再范),后面試了下把call加上,改成:
Call printArr("排序前的隨機數:",n)
問題解決?。?!
二、 問題總結
后面又通過幾個例子試了下。發現:
如果過程的參數中包含有數組的參數,則call一定要加上;
否則call可以省略。
三、 經驗教訓
Option Compare Database
Private Const ARR_LOW = 1 '數組上標
Private Const ARR_UPP = 20 '數組下標
Private Sub numSort()
Dim n(ARR_LOW To ARR_UPP) As Integer
Dim i As Integer
For i = LBound(n) To UBound(n)
Randomize
n(i) = Rnd() * 101
Next
'打印排序前隨機數
Call printArr("排序前的隨機數:", n)
'排序
Dim temp As Integer
Dim j As Integer
For i = LBound(n) To UBound(n)
For j = i To UBound(n)
If (n(i) > n(j)) Then
temp = n(i)
n(i) = n(j)
n(j) = temp
End If
Next
Next
'打印排序后隨機數
Call printArr("排序后的隨機數:", n)
End Sub
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。