摘要:過程調用是Visual Basic中重要的知識點,是學生不易理解的一個環節。提出了對過程調用正確有效分析的方法,并就按地址傳遞參數中學生較易混淆的問題進行了分析。
關鍵詞:Sub過程;Function過程;過程調用
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)19-30056-02
Analysis and Discussion on Procedure Call in VB
CHENG Xue-yun, XU Hui
(School of Computer Science and Technology, Nantong University, Nantong 226019, China)
Abstract: Procedure call is an important knowledge point in Visual Basic(VB), and it not easily understood by students. A right and efficient method uesed to analyze procedure call is proposed, and two easily confused examples which pass the parameters by address are discussed in detail.
Key words: Sub procedure; Funciton procedure; procedure call
1 引言
VB采用面向對象的可視化操作窗口,功能強大,應用廣泛,相對其他面向對象的編程語言(如VC++等)容易學。在編程中,往往根據需要按功能將程序分解成若干個相對獨立的部分,然后對每個部分分別編寫一段程序,稱之為過程。等級考試中要求學生掌握的過程主要有事件過程、Sub過程和Function過程。Sub過程不返回值,Function過程必須由函數名返回一個值,Sub過程和Function過程必須在事件過程或其他過程中顯式調用,否則過程代碼永遠不會被執行。過程調用是VB教學中的重點和難點,在文獻[2-3]中,對過程調用中的參數傳遞進行了仔細地分析,對不同的參數傳遞方式進行了比較,也給出了分析的一般方法,但在實際求解中,如果涉及的問題比較復雜時,該方法還是比較容易出錯,為此根據平時的教學總結,提出了一種分析過程調用的圖示法,可清楚地反映調用過程。
2 過程調用及分析方法
每當調用一個Sub過程或Function過程時,VB就將程序的返回地址(斷點)、參數以及局部變量等壓入棧內。被調用的過程運行結束后,VB將回收存放變量和參數的??臻g,然后返回主調程序的斷點繼續程序的運行[4]。
在調用過程時,主調過程的實參以一定的形式傳遞給被調過程的形參,完成實參與形參的結合,然后執行被調過程體。經被調過程處理后,又將所得結果返回給主調過程。VB中,參數的傳遞有傳值和傳址兩種形式。
2.1 傳值方式
當調用一個過程時,將實參的值復制給形參,實參與形參斷開聯系。過程調用結束時,形參占用的存儲單元被釋放,因此對形參的任何操作都不會影響到實參。傳值方式是“單向”的,形參的值不能返回給實參。
2.2.傳址方式
當調用一個過程時,將實參的地址傳遞給形參,即過程接受的是實參變量的地址。因此在被調過程中對形參的任何操作都變成了對相應實參的操作,實參的值會隨著形參的改變而改變,這種傳遞是“雙向”的。
2.3 分析方法
在教學中,通過總結給出了如下對過程調用的分析方法:從左到右依次列舉出調用關系,在每個過程中,列舉出涉及到的變量(將函數名也作為一個變量)。如果是按址傳遞的變量在對應的形參上用括號標注相應的實參,過程調用結束時及時將實參的值返回;如果是靜態變量標注上(static),下次調用時記得保留上次調用結束時的值。
例1 下列程序運行后輸出的結果是:
Option Explicit
Private Sub Command1_Click()
Dim i As Integer, j As Integer
Dim k As Integer
i = 10
j = 4
k = i+funk(i,j) (1)
Print i,j,k
End Sub
Private Function funk(A as Integer, B as Integer) As Integer
A = A+B
B = B-2
funk = A+B
End Function
運行后得到的結果是14 2 26,通過該方法能簡潔明了地得到正確結果。同時也說明在k=i+funk(i,j)中前一個i的值還是調用funk(i,j)前的值10,在學生的分析中是較容易出錯的一個地方。這是因為在算術表達式中是按照從左到右的求解次序,先求出第一個i的值10,然后調用funk(i,j)得到16,和為26,但調用結束后i的值發生了變化。如果將(1)處改為 k=funk(i,j)+i,則后一個i的值會隨前一個i的變化而變化。
3 特例分析
在實際問題中,過程調用的形式比較復雜,針對不同的問題分析的思路也不盡相同,所以要求學生在學習中要靈活掌握過程調用的本質,從根本上掌握分析的方法。將上例中的(1)處的調用語句改為k =funk(i, funk(i,j)),得到例2,其分析如表2。
表2 例2的分析過程
■
運行后得到的結果是30 2 44。在程序中對于k=funk(i,funk(i,j))語句,前一個i受到后一個i的影響,第一次調用括號內的funk(i,j)后i的值為14,第二次調用funk函數時,第一個實參的值變為14,過程調用中變量在棧中的分配如表3所示。
假設實參i、j的地址分別為1000、1002,對函數funk(i,funk(i,j))調用時,首先將形參A入棧,因為是按址傳遞,所以棧中存放的是實參i的地址1000,然后調用括號內的funk(i,j)函數,再次將形參A入棧,還是實參i的地址1000,將B也入棧,存放的是實參j的地址1002。Funk(i,j)調用結束后,雖然1010和1012單元被釋放,但是1000單元的內容被改變,所以funk(i,funk(i,j))中第一個i值跟著改變。
這兩個示例看似區別不大,但學生對第一個i是否變化在分析過程中特別容易混淆,所以在實際問題中要從根本上理解調用的過程。
4 結束語
本文介紹了過程調用分析的方法,針對過程調用中按址傳遞、靜態變量、同名變量、遞歸調用、調用層次比較深等一些棘手的問題,該方法能清楚地反映各變量的變化,得到正確的結果。同時通過兩個相似例題的分析,闡述了調用的執行流程,根本上解答了學生較易混淆的問題。
參考文獻:
[1] 羅朝盛,余文芳,余平. Visual Basic 6.0程序設計教程[M]. 人民郵電出版社,2005.
[2] 陳鳳云, 白振興. 過程調用中參數傳遞方式的分析[J]. 現代電子技術,2003(7):55-57.
[3] 肖捷, 祝庚, 肖振新. VB過程調用中參數傳遞的深入分析[J]. 計算機與現代化,2007(10):91-93.
[4] 牛又奇, 孫建國. 新編Visual Basic程序設計教程[M]. 蘇州大學出版社,2008.
注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文