蒲會(huì)蘭 丁世文 李敏之 張永花
摘 要: 過程調(diào)用作為Visual Basic程序設(shè)計(jì)的難點(diǎn)及重點(diǎn)之一,初學(xué)者對其中不同參數(shù)傳遞方式很難理解和掌握。為此提出了過程調(diào)用結(jié)合內(nèi)存管理的新教學(xué)方法,將內(nèi)存概念引入過程調(diào)用,通過分析計(jì)算機(jī)內(nèi)存管理和Visual Basic程序運(yùn)行的相互關(guān)系,對過程間不同參數(shù)的傳遞方式進(jìn)行了解析,將抽象的過程執(zhí)行步驟以直觀的內(nèi)存管理圖示表現(xiàn)出來,幫助學(xué)生理解Visual Basic過程調(diào)用中的參數(shù)傳遞方式。該方法在教學(xué)實(shí)踐中取得了良好的效果。
關(guān)鍵詞: Visual Basic; 內(nèi)存; 過程調(diào)用; 實(shí)際參數(shù); 形式參數(shù); 參數(shù)傳遞
中圖分類號:TP311 文獻(xiàn)標(biāo)志碼: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)是以結(jié)構(gòu)化BASIC語言為基礎(chǔ),以可視化設(shè)計(jì)工具為界面設(shè)計(jì),以事件驅(qū)動(dòng)為運(yùn)行機(jī)制的高級程序設(shè)計(jì)語言,已被高校作為部分非計(jì)算機(jī)專業(yè)的入門課程。過程調(diào)用是VB程序設(shè)計(jì)的難點(diǎn)及重點(diǎn)之一,初學(xué)者對過程調(diào)用中不同參數(shù)傳遞方式很難理解和掌握。本文針對該課程教學(xué)難點(diǎn),結(jié)合多年的實(shí)踐教學(xué)經(jīng)驗(yàn),將內(nèi)存概念引入過程調(diào)用,通過直觀的內(nèi)存管理圖幫助學(xué)生理解VB過程調(diào)用中的參數(shù)傳遞方式,在教學(xué)實(shí)踐中取得了良好的效果。
1 基本概念
過程是VB程序的基本組成單位,每個(gè)過程是為了完成一定的任務(wù),由一組獨(dú)立的程序代碼組成。在VB中除了系統(tǒng)提供的內(nèi)部函數(shù)過程和事件過程外,用戶可根據(jù)要解決的問題,定義Sub子過程和Function函數(shù)過程。
要執(zhí)行子過程中的代碼或獲得函數(shù)過程的返回值,只能通過調(diào)用過程完成,在調(diào)用過程時(shí),被調(diào)過程可以接收主調(diào)過程傳遞過來的參數(shù),并能根據(jù)接收到的參數(shù)控制程序流程或?qū)邮盏降膮?shù)進(jìn)行處理。主調(diào)過程中的參數(shù)稱為實(shí)際參數(shù),簡稱實(shí)參,實(shí)參可以是常量、變量、表達(dá)式、數(shù)組名、數(shù)組元素等;被調(diào)過程中的參數(shù)稱為形式參數(shù),簡稱形參,形參一般為內(nèi)存變量或數(shù)組名。在Visual Basic過程調(diào)用中,參數(shù)傳遞方式分為“傳值”和“傳地址”兩種[1-4]。
2 內(nèi)存概念在過程調(diào)用中的應(yīng)用
運(yùn)行VB程序時(shí),系統(tǒng)將根據(jù)變量或數(shù)組的數(shù)據(jù)類型,為其分配相應(yīng)的內(nèi)存單元,以便存儲(chǔ)它們的內(nèi)容,內(nèi)存區(qū)的每一個(gè)存儲(chǔ)單元有一個(gè)編號,即內(nèi)存單元的“地址”,程序中的各種操作在內(nèi)存中均表現(xiàn)為對內(nèi)存單元的讀寫操作[5]。本文通過動(dòng)態(tài)展現(xiàn)過程調(diào)用中內(nèi)存單元的變化情況,幫助學(xué)生理解“傳值”方式和“傳地址”方式的不同之處,使這一難點(diǎn)迎刃而解。
用戶根據(jù)要解決的問題可定義兩種過程:當(dāng)過程有多個(gè)返回值或無返回值時(shí),常用子過程;當(dāng)過程有一個(gè)返回值時(shí),函數(shù)過程比較直觀。由于在兩種過程調(diào)用中參數(shù)傳遞機(jī)制相同,故本文不妨以子過程的定義、調(diào)用和參數(shù)傳遞為例進(jìn)行探討。
2.1 子過程的定義和調(diào)用
子過程的定義形式如下[1-3]:
[ Public | Private ]Sub 子過程名([形參列表])
局部變量或常數(shù)定義
語句塊
End Sub
其中,形參列表指明了參數(shù)的類型和個(gè)數(shù),每個(gè)參數(shù)的形式為:
[ ByVal | ByRef ]形參名[()][As 類型]
形參名,簡稱形參或啞元,只能是變量或數(shù)組名,用于在調(diào)用該過程時(shí)的數(shù)據(jù)傳遞;變量名前的[ ByVal | ByRef ]是可選的,默認(rèn)為ByRef,表示形參是地址傳遞;ByVal表示形參是值傳遞。
子過程的調(diào)用形式如下[1-3]:
【形式1】call子過程名[(實(shí)參列表)]
【形式2】子過程名[實(shí)參列表]
其中,實(shí)參列表簡稱實(shí)參,它的個(gè)數(shù)應(yīng)與形參的個(gè)數(shù)保持相同;其位置、類型與形參一一對應(yīng)。【形式1】中,若無實(shí)參,則省略括號,若有實(shí)參,則實(shí)參必須加括號;【形式2】中實(shí)參無需加括號。
2.2 參數(shù)傳遞方式
調(diào)用過程時(shí),一般將主調(diào)過程的實(shí)參傳遞給被調(diào)過程的形參,完成實(shí)參與形參的結(jié)合,然后執(zhí)行被調(diào)過程體。實(shí)參與形參的結(jié)合有“傳值”與“傳地址”兩種方式。
2.2.1 傳值
在定義過程時(shí),若采用傳值方式,則調(diào)用過程時(shí),系統(tǒng)為形參開辟臨時(shí)存儲(chǔ)區(qū),將各實(shí)參值復(fù)制給形參,有如下過程:
Sub swap1(ByVal a%, ByVal b%)
Dim t%
t=a: a=b: b=t
Print "swap1過程內(nèi):a="; a; Tab(24); "b="; b
End Sub
Private Sub Command1_Click()
Dim x%, y%
x=6: y=8
Print "調(diào)用swap1前:x="; x; Tab(24); "y="; y
Call swap1(x, y)
Print "調(diào)用swap1后:x="; x; Tab(24); "y="; y
End Sub
子過程swap1的功能是交換形式參數(shù)a、b的值。Command1_Click()事件過程中的語句Call swap1(x,y)是過程調(diào)用語句,被調(diào)過程中形參是傳值方式,執(zhí)行過程,運(yùn)行結(jié)果如下。
通過內(nèi)存管理圖分析過程調(diào)用:調(diào)用過程前系統(tǒng)只為實(shí)參x和y分配內(nèi)存單元,其地址假定為2000和2004,如圖1所示;調(diào)用過程時(shí),系統(tǒng)根據(jù)形參a和b的類型為其臨時(shí)分配內(nèi)存單元,并將主調(diào)過程實(shí)參的值一一復(fù)制到被調(diào)過程對應(yīng)形參的內(nèi)存單元中,即形參獲得了實(shí)參的值,如圖2所示;當(dāng)執(zhí)行swap1過程時(shí),由于實(shí)參與形參已斷開了聯(lián)系,即實(shí)參、形參占用不同的內(nèi)存單元,形參值的變化不會(huì)影響實(shí)參值,如圖3所示;過程調(diào)用結(jié)束時(shí),形參所占內(nèi)存單元被釋放,實(shí)參x和y的值并未交換,如圖4所示。
[2000][2004][x][y][\&6\&\&8\&\&] [3000][3004][a][b][2000][2004][x][y][\&6\&\&8\&\&][\&6\&\&8\&\&]
圖1 過程調(diào)用前內(nèi)存圖 圖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 過程調(diào)用后內(nèi)存圖
2.2.2 傳地址
⑴ 內(nèi)存變量作為過程參數(shù)
在定義過程時(shí),若采用傳地址方式,則調(diào)用過程時(shí),系統(tǒng)將各實(shí)參的地址傳遞給形參,形參、實(shí)參具有相同的地址,即形參變量與實(shí)參變量共用相同的存儲(chǔ)單元,在被調(diào)用過程中對形參的任何操作將變成了對相應(yīng)實(shí)參的操作。過程如下所示:
Sub swap2(ByRef a%, ByRef b%)
Dim t%
t=a: a=b: b=t
Print "swap2過程內(nèi):a="; a; Tab(24); "b="; b
End Sub
Private Sub Command2_Click()
Dim x%, y%
x=6: y=8
Print "調(diào)用swap2前:x="; x; Tab(24); "y="; y
Call swap2(x, y)
Print "調(diào)用swap2后:x="; x; Tab(24); "y="; y
End Sub
子過程swap2的功能是交換形式參數(shù)a、b的值,形參采用“傳地址”方式,在Command2_Click()事件過程中調(diào)用過程swap2,執(zhí)行過程,運(yùn)行結(jié)果如下:
通過內(nèi)存管理圖分析調(diào)用過程:調(diào)用過程前系統(tǒng)僅為實(shí)參x和y分配內(nèi)存單元,其地址假定為2000和2004,如圖5所示;調(diào)用過程時(shí),由于形參前的關(guān)鍵字為“ByRef”,即采用傳地址方式,因此形參和實(shí)參結(jié)合時(shí),不是把實(shí)參的值傳遞給形參,而是將實(shí)參的地址傳給形參,使形參和實(shí)參具有相同的地址,占有相同的內(nèi)存單元,即x和a、y和b占有相同的內(nèi)存單元,如圖6所示;執(zhí)行swap2過程,形參值進(jìn)行交換,即對實(shí)參x和y的內(nèi)存單元值進(jìn)行修改,如圖7所示;所以過程調(diào)用結(jié)束時(shí)實(shí)參x和y的值已被交換,如圖8所示。
[2000][2004][x][y][\&6\&\&8\&\&] [2000][2004][x][y][\&6\&\&8\&\&][a][b]
圖5 調(diào)用過程前內(nèi)存圖 圖6 參數(shù)傳遞示意圖
[2000][2004][x][y][\&8\&\&6\&6\&][a][b][t][2006] [2000][2004][x][y][\&8\&\&6\&\&]
圖7 執(zhí)行swap2過程示意圖 圖8 調(diào)用過程后內(nèi)存圖
⑵ 數(shù)組作為過程參數(shù)
數(shù)組作為過程參數(shù)傳遞時(shí),也采用傳地址方式,在調(diào)用過程時(shí),系統(tǒng)把實(shí)參數(shù)組的首地址傳給形參數(shù)組,使形參數(shù)組也具有與實(shí)參數(shù)組相同的首地址,由于形參數(shù)組和實(shí)參數(shù)組各元素共用相同的內(nèi)存單元,對形參數(shù)組中某一元素的操作將影響實(shí)參數(shù)組中的對應(yīng)元素。過程如下所示:
Sub sort(a())
Dim i%, j%, mini%, t%
For i=1 To UBound(a)-1
mini=i
For j=i+1 To UBound(a)