蒲會蘭 丁世文 李敏之 張永花
摘 要: 過程調用作為Visual Basic程序設計的難點及重點之一,初學者對其中不同參數(shù)傳遞方式很難理解和掌握。為此提出了過程調用結合內存管理的新教學方法,將內存概念引入過程調用,通過分析計算機內存管理和Visual Basic程序運行的相互關系,對過程間不同參數(shù)的傳遞方式進行了解析,將抽象的過程執(zhí)行步驟以直觀的內存管理圖示表現(xiàn)出來,幫助學生理解Visual Basic過程調用中的參數(shù)傳遞方式。該方法在教學實踐中取得了良好的效果。
關鍵詞: Visual Basic; 內存; 過程調用; 實際參數(shù); 形式參數(shù); 參數(shù)傳遞
中圖分類號:TP311 文獻標志碼:A 文章編號:1006-8228(2014)10-46-03
Analysis on parameter transfer modes in Visual Basic procedure calling
Pu Huilan1, Ding Shiwen2, Li Minzhi1, Zhang Yonghua1
(1. School of Electronic and Information Engineering, Lanzhou Jiaotong University, Lanzhou, Gansu 730070, China;
2. School of Environmental and Municipal Engineering, Lanzhou Jiaotong University)
Abstract: Procedure calling is one of the difficulties and emphasis in Visual Basic programming. Its uneasy for the beginners to understand and grasp that transfer modes of different parameters in the procedure calling. With years of experience in the practice teaching, a new teaching method incorporated with procedure calling and main memory management is proposed. The concept of main memory is introduced to procedure calling. Through analysis on the relationship of main memory management and Visual Basic program running, transfer modes of different parameters in Visual Basic procedure calling are explored. The abstract running steps in the procedure calling are displayed by definite main memory management graph. It helps students understand the way of parameter passing in Visual Basic procedure calling, which has achieved good effect in teaching practice.
Key words: Visual Basic; main memory; procedure calling; nominal parameter; specific parameter; parameter transfer
0 引言
Visual Basic(簡稱VB)是以結構化BASIC語言為基礎,以可視化設計工具為界面設計,以事件驅動為運行機制的高級程序設計語言,已被高校作為部分非計算機專業(yè)的入門課程。過程調用是VB程序設計的難點及重點之一,初學者對過程調用中不同參數(shù)傳遞方式很難理解和掌握。本文針對該課程教學難點,結合多年的實踐教學經(jīng)驗,將內存概念引入過程調用,通過直觀的內存管理圖幫助學生理解VB過程調用中的參數(shù)傳遞方式,在教學實踐中取得了良好的效果。
1 基本概念
過程是VB程序的基本組成單位,每個過程是為了完成一定的任務,由一組獨立的程序代碼組成。在VB中除了系統(tǒng)提供的內部函數(shù)過程和事件過程外,用戶可根據(jù)要解決的問題,定義Sub子過程和Function函數(shù)過程。
要執(zhí)行子過程中的代碼或獲得函數(shù)過程的返回值,只能通過調用過程完成,在調用過程時,被調過程可以接收主調過程傳遞過來的參數(shù),并能根據(jù)接收到的參數(shù)控制程序流程或對接收到的參數(shù)進行處理。主調過程中的參數(shù)稱為實際參數(shù),簡稱實參,實參可以是常量、變量、表達式、數(shù)組名、數(shù)組元素等;被調過程中的參數(shù)稱為形式參數(shù),簡稱形參,形參一般為內存變量或數(shù)組名。在Visual Basic過程調用中,參數(shù)傳遞方式分為“傳值”和“傳地址”兩種[1-4]。
2 內存概念在過程調用中的應用
運行VB程序時,系統(tǒng)將根據(jù)變量或數(shù)組的數(shù)據(jù)類型,為其分配相應的內存單元,以便存儲它們的內容,內存區(qū)的每一個存儲單元有一個編號,即內存單元的“地址”,程序中的各種操作在內存中均表現(xiàn)為對內存單元的讀寫操作[5]。本文通過動態(tài)展現(xiàn)過程調用中內存單元的變化情況,幫助學生理解“傳值”方式和“傳地址”方式的不同之處,使這一難點迎刃而解。
用戶根據(jù)要解決的問題可定義兩種過程:當過程有多個返回值或無返回值時,常用子過程;當過程有一個返回值時,函數(shù)過程比較直觀。由于在兩種過程調用中參數(shù)傳遞機制相同,故本文不妨以子過程的定義、調用和參數(shù)傳遞為例進行探討。
2.1 子過程的定義和調用
子過程的定義形式如下[1-3]:
[ Public | Private ]Sub 子過程名([形參列表])
局部變量或常數(shù)定義
語句塊
End Sub
其中,形參列表指明了參數(shù)的類型和個數(shù),每個參數(shù)的形式為:
[ ByVal | ByRef ]形參名[()][As 類型]
形參名,簡稱形參或啞元,只能是變量或數(shù)組名,用于在調用該過程時的數(shù)據(jù)傳遞;變量名前的[ ByVal | ByRef ]是可選的,默認為ByRef,表示形參是地址傳遞;ByVal表示形參是值傳遞。
子過程的調用形式如下[1-3]:
【形式1】call子過程名[(實參列表)]
【形式2】子過程名[實參列表]
其中,實參列表簡稱實參,它的個數(shù)應與形參的個數(shù)保持相同;其位置、類型與形參一一對應?!拘问?】中,若無實參,則省略括號,若有實參,則實參必須加括號;【形式2】中實參無需加括號。
2.2 參數(shù)傳遞方式
調用過程時,一般將主調過程的實參傳遞給被調過程的形參,完成實參與形參的結合,然后執(zhí)行被調過程體。實參與形參的結合有“傳值”與“傳地址”兩種方式。
2.2.1 傳值
在定義過程時,若采用傳值方式,則調用過程時,系統(tǒng)為形參開辟臨時存儲區(qū),將各實參值復制給形參,有如下過程:
Sub swap1(ByVal a%, ByVal b%)
Dim t%
t=a: a=b: b=t
Print "swap1過程內:a="; a; Tab(24); "b="; b
End Sub
Private Sub Command1_Click()
Dim x%, y%
x=6: y=8
Print "調用swap1前:x="; x; Tab(24); "y="; y
Call swap1(x, y)
Print "調用swap1后:x="; x; Tab(24); "y="; y
End Sub
子過程swap1的功能是交換形式參數(shù)a、b的值。Command1_Click()事件過程中的語句Call swap1(x,y)是過程調用語句,被調過程中形參是傳值方式,執(zhí)行過程,運行結果如下。
通過內存管理圖分析過程調用:調用過程前系統(tǒng)只為實參x和y分配內存單元,其地址假定為2000和2004,如圖1所示;調用過程時,系統(tǒng)根據(jù)形參a和b的類型為其臨時分配內存單元,并將主調過程實參的值一一復制到被調過程對應形參的內存單元中,即形參獲得了實參的值,如圖2所示;當執(zhí)行swap1過程時,由于實參與形參已斷開了聯(lián)系,即實參、形參占用不同的內存單元,形參值的變化不會影響實參值,如圖3所示;過程調用結束時,形參所占內存單元被釋放,實參x和y的值并未交換,如圖4所示。
[2000][2004][x][y][\&6\&\&8\&\&] [3000][3004][a][b][2000][2004][x][y][\&6\&\&8\&\&][\&6\&\&8\&\&]
圖1 過程調用前內存圖 圖2 參數(shù)傳遞示意圖
[3000][3004][a][b][2000][2004][x][y][\&6\&\&8\&\&][\&8\&\&6\&6\&][3006][t] [2000][2004][x][y][\&6\&\&8\&\&]
圖3 執(zhí)行swap1過程示意圖 圖4 過程調用后內存圖
2.2.2 傳地址
⑴ 內存變量作為過程參數(shù)
在定義過程時,若采用傳地址方式,則調用過程時,系統(tǒng)將各實參的地址傳遞給形參,形參、實參具有相同的地址,即形參變量與實參變量共用相同的存儲單元,在被調用過程中對形參的任何操作將變成了對相應實參的操作。過程如下所示:
Sub swap2(ByRef a%, ByRef b%)
Dim t%
t=a: a=b: b=t
Print "swap2過程內:a="; a; Tab(24); "b="; b
End Sub
Private Sub Command2_Click()
Dim x%, y%
x=6: y=8
Print "調用swap2前:x="; x; Tab(24); "y="; y
Call swap2(x, y)
Print "調用swap2后:x="; x; Tab(24); "y="; y
End Sub
子過程swap2的功能是交換形式參數(shù)a、b的值,形參采用“傳地址”方式,在Command2_Click()事件過程中調用過程swap2,執(zhí)行過程,運行結果如下:
通過內存管理圖分析調用過程:調用過程前系統(tǒng)僅為實參x和y分配內存單元,其地址假定為2000和2004,如圖5所示;調用過程時,由于形參前的關鍵字為“ByRef”,即采用傳地址方式,因此形參和實參結合時,不是把實參的值傳遞給形參,而是將實參的地址傳給形參,使形參和實參具有相同的地址,占有相同的內存單元,即x和a、y和b占有相同的內存單元,如圖6所示;執(zhí)行swap2過程,形參值進行交換,即對實參x和y的內存單元值進行修改,如圖7所示;所以過程調用結束時實參x和y的值已被交換,如圖8所示。
[2000][2004][x][y][\&6\&\&8\&\&] [2000][2004][x][y][\&6\&\&8\&\&][a][b]
圖5 調用過程前內存圖 圖6 參數(shù)傳遞示意圖
[2000][2004][x][y][\&8\&\&6\&6\&][a][b][t][2006] [2000][2004][x][y][\&8\&\&6\&\&]
圖7 執(zhí)行swap2過程示意圖 圖8 調用過程后內存圖
⑵ 數(shù)組作為過程參數(shù)
數(shù)組作為過程參數(shù)傳遞時,也采用傳地址方式,在調用過程時,系統(tǒng)把實參數(shù)組的首地址傳給形參數(shù)組,使形參數(shù)組也具有與實參數(shù)組相同的首地址,由于形參數(shù)組和實參數(shù)組各元素共用相同的內存單元,對形參數(shù)組中某一元素的操作將影響實參數(shù)組中的對應元素。過程如下所示:
Sub sort(a())
Dim i%, j%, mini%, t%
For i=1 To UBound(a)-1
mini=i
For j=i+1 To UBound(a)