文章編號:1672-5913(2008)20-0138-02
摘 要:變量的使用是VB程序設計中必不可少的重要環節,而在教學中變量的使用技巧沒有得到足夠的重視,學生的掌握程度不佳。本文著重探討了變量錯用導致的“溢出”問題和變體型變量的使用問題。
關鍵詞:VB程序設計;變量類型;溢出;變體型
中圖分類號:G642 文獻標識碼:B
1 引言
Visual Basic(以下簡稱VB)是一種可視化的、面向對象和采用事件驅動方式的結構化高級程序設計語言,可用于開發Windows環境下的各類應用程序。它簡單易學、效率高、功能又強,所以目前很多院校將它作為非計算機專業軟件技術基礎課程講授的編程語言之一(使用VB6.0版本)。
筆者在講授這門課程的過程中發現,變量的使用是任何一種程序設計語言中都必不可少的環節,變量用來存放程序運行時使用到的數據和程序運行產生的中間結果,正確的使用變量可以使程序清晰明了,減少程序運行時占用的內存,提高運行效率。然而由于VB常作為非計算機專業的第一門程序設計課程,加之課時有限,所以無論在教材中,還是在課堂講授中,對變量的講解都比較淺顯,不能滿足學生實際應用的需要。筆者特將兩個和變量相關的問題提出來,與講授這門課程的教師們共同探討。
2 變量類型使用錯誤導致的溢出問題
大多數VB程序設計教程都很少提及賦值和計算中的“溢出”問題。然而在學生的編程中,“溢出”卻是不可回避的一個問題。不正確的變量類型使用可能導致“溢出”。例如在龔沛曾等主編的教材《Visual Basic 程序設計教程》(第3版)的實驗篇中有這樣一道題目[1]。
[例1]計算π的近似值,π的計算公式為:
注意:
① 分別顯示當n=10、100、1000時的結果,由此可見,此公式收斂程度如何?
② 同時為防止大相乘是結果溢出的問題,將變量類型改為長整型或實數類型。
大部分學生會寫出這樣的程序段:
Private Sub Form_Click()
Dim pi As Single, n As Integer, t As Single
pi = 2
For n = 1 To 10
t = (2 * n) ^ 2 / ((2 * n - 1) * (2 * n + 1))
pi = pi * t
Next n
Print \"n=10時,π=\"; pi
pi = 2
For n = 1 To 100
t = (2 * n) ^ 2 / ((2 * n - 1) * (2 * n + 1)) ‘此句發生溢出
pi = pi * t
Next n
Print \"n=100時, =\"; pi
……
End Sub
當程序運行到程序中加注釋的語句時會產生運行期錯誤“實時錯誤'6':溢出”。(見圖1)學生們都注意到變量t用來保存公式的通項,應該使用精度比較高的實型數據,而認為n變量的取值分別是1~10、1~100、1~1000,當然使用整型(integer)就可以了。其實,錯誤就出在這里。為了解釋這個問題,我們舉一個簡單的例子,如下程序段:
[例2] Private Sub Command1_Click()
Dim c As Long
c = 3 2* 1024
End Sub
圖1
程序運行時會發生溢出錯誤。大部分學生會認為,變量c已經是長整型了,足以放的下32×1024的積,怎么還會溢出呢?其實,VB在做數值運算時,會先開辟一個內存地址來存放計算結果,然后再傳送到指定的變量中。如上面的程序,變量c雖然是長整型,其可存放數值的范圍是(-2147483648,+2147483647),但VB做計算時,將32判斷為整數,1024也判斷為整數,就任意在內存的某個位置開辟2Byte大小的空間來存放32×1024的值,然后再回存至變量c。但32×1024(即32768)已超過任意在內存的某個地址開辟的2Byte的大小,故溢出。
怎樣解決溢出問題呢?答案就是轉變數據的類型。將例2的程序段改為:
Private Sub Command1_Click()
Dim c As Long
c = CLng(3 2)*CLng( 1024)
End Sub
就可以正常計算了。理解了VB做數值運算的內部機理,我們就可以重新審視例1。當程序發生溢出錯誤時,我們點擊“調試”,出錯的語句會高亮度顯示,我們把光標放在n變量上,可以發現溢出時n的值為91,n=91時,表達式(2 * n - 1) * (2 * n + 1)的值為33123。通過例2我們得知,n為整型變量,計算機會認為表達式2*n-1和2*n+1也是整型,所以會在內存中開辟2Byte的空間暫時存儲表示式(2 * n - 1) * (2 * n + 1)的值,當n取值91時,乘積大于整型變量的取值范圍-32768~+32767,故溢出。解決的辦法可以有多種:
(1)將變量n定義為長整型或實型。
(2)將錯誤語句中的乘數2后面加上長整型類型符或者實型符號!、#均可。
(3)避免大數相乘,將錯誤語句改為t = (2 * n) ^ 2 / (2 * n - 1) / (2 * n + 1)。
3 慎用變體型(Variant)變量
很多教師在講授VB程序設計的過程中不注重強調變量的顯式聲明,而且在安裝VB時,它的默認設置并不要求對變量進行顯式聲明,所以學生們都不是很注意這個問題。由于VB程序設計課程不強調在程序編寫之前畫出流程圖,所以大部分學生習慣于在程序編寫之前不對程序所要使用的變量進行通盤考慮,而是在最后需要使用的時候才將變量插進來。而VB規定所有未定義的變量默認為Variant型。例如下面的程序段,其中的變量i將作為Variant處理。
Private Sub Command1_Click()
Dim MyArray(5) As Single
For i = 0 To 5
a(i) = inputbox(\"請輸入第\" i \"個元素的值\")
Next i
End Sub
還有一些同學在變量聲明中沒有包含As<類型>子句,那么該變量也被創建為Variant型。例如下面兩個變量聲明將產生相同的結果:
Dim MyVarialble
Dim MyVarialble As Variant
對于用戶創建的Function過程來講,這一原則也同樣使用。定義一個函數時,如果不包含As<類型>子句,函數的返回值將始終是Variant。下面兩個函數定義也產生相同的結果:
Private Function MyFunction()
Private Function MyFunction() as Variant
這一點也是我們講課時經常忽略的。
雖然VB能夠很好地確定Variant中存放的數據類型并應用相應的運算規則,然而Variant變量存在一個重大的缺陷就是它們占用的內存比VB的任何其他數據類型都要多。每一個Integer占2個字節,Double占8個字節,而每一個Variant存放任何數值數據都占用個16字節。變長字符串變量占用4個字節加上宇符串中每一個宇符占用1個字節,而每一個包含字符串的Variant都要占用22個字節加上字符串長度。任何數據類型的Variant數組都要占用20個字節內存,加上4字節用于每個維數,再加上用于每個數據元素本身的字節數。Variant不僅占用的內存比其他數據類型要多,而且對于Variant中的數據操作時的速度幾乎總是比對其他數據類型進行操作的速度要慢[2]。因此在用作局部變量或過程的參數時,Variant變量是特別煩人的,因為它們消耗堆??臻g太快[3]。因此,教師應引導學生在開始學習編程時就養成良好的習慣,注意顯示聲明變量,并為變量精心選擇數據類型,絕對必要時才采用變體型。
4 結束語
本文對VB教學中普遍容易忽略的變量類型選用問題進行了初步的探討,變量的正確使用關系到程序運行結果的準確型和運行的效率,關系重大,值得我們認真加以研究。同時,要精確的使用變量,也非一件易事,需要我們進一步的探討。
參考文獻
[1] 龔沛曾.Visual Basic程序設計教程[M].北京:高等教育出版社,2007.
[2](美)James D.Foxall著.王建華譯.Visual Basic編程標準[M].北京:機械工業出版社,2000.
[3] 姚福娥.談VB程序設計的后續的若干問題[J].科技信息,2006,(8):12-13.
“本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文”