2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩80頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、第九章 過程,9.1 Sub過程,9.2 Function過程,9.3 參數(shù)傳遞,9.4 可選參數(shù)與可變參數(shù),9.5 對象參數(shù),9.6 局部內(nèi)存分配,9.7 Shell函數(shù),9.8 應(yīng)用舉例,將程序分割成較小的邏輯部件就可以簡化程序設(shè)計任務(wù),稱這些部件為過程,它們可以變成增強和擴展 Visual Basic 的構(gòu)件。VB中有兩類過程,一類是內(nèi)部過程,另—類是外部過程,每類過程又可分為函數(shù)過程和事件過程。內(nèi)部過程是由系統(tǒng)提供的、不需要用

2、戶編寫、可直接用過程名調(diào)用的程序段。外部過程是由用戶根據(jù)自己的需要定義和編寫的、可供事件過程多次調(diào)用的程序段。過程的使用,一方面將大的程序分成離散的邏輯單元,方便程序的調(diào)試;另一方面,方便了其他的程序或過程的調(diào)用。,Visual Basic的應(yīng)用程序是由過程組成的。在用Visual Basic設(shè)計應(yīng)用程序時,除了定義常量和變量外,全部工作就是編寫過程。Visual Basic 中的過程可以看作是編寫程序的功能模塊。從本質(zhì)上說,使用過程是

3、在擴充Visual Basic的功能。 在前面的各章中,已多次見過事件過程,這樣的過程是當發(fā)生某個事件(如Click、Load、Change)時,對該事件作出響應(yīng)的程序段,這種事件過程構(gòu)成Visual Basic應(yīng)用程序的主體。有時候,多個不同的事件過程可能需要使用一段相同的程序代碼,因此可以把這段代碼獨立出來,作為一個過程,這樣的過程叫做“通用過程”(general procedure),它可以單獨建立,供事件過程或其他通用過程

4、調(diào)用。,在Visual Basic中,通用過程分為兩類,即子程序過程和函數(shù)過程,前者叫做Sub過程,后者叫做Function過程。此外,Visual Basic也允許用Gosub…Return語句來實現(xiàn)子程序調(diào)用,但它不能作為Visual Basic的過程。在本章中,將介紹如何在Visual Basic應(yīng)用程序中使用通用過程。9.1 Sub過程 Visual Basic提供了子程序過程和函數(shù)過程。為了便于區(qū)分,在今

5、后的敘述中,我們把Sub…End Sub 定義的子程序叫做子程序過程或Sub過程,而把由Function…End Function定義的函數(shù)叫做函數(shù)過程或Function過程。這一節(jié)介紹Sub過程的定義和調(diào)用,下一節(jié)將介紹Function過程。,,1. Sub過程(1)定義Sub過程 通用Sub過程的結(jié)構(gòu)與事件過程的結(jié)構(gòu)類似。一般格式如下:[Static][Private][Public]Sub 過程名[(參數(shù)表列)]

6、 語句塊   [Exit Sub] [語句塊]End Sub 用上述格式可以定義一個Sub過程,例如:Private Sub Subtest( ) Print “This is a Sub procedure”End Sub,說明:(1) Sub過程以Sub開頭,以End Sub結(jié)尾,在Sub和End Sub之間是描述過程操作的語句塊,稱為“過程體”或“子程序體”。格式

7、中各參量的含義如下:① Static:指定過程中的局部變量在內(nèi)存中的默認存儲方式。如果使用了Static,則過程中的局部變量就是“Static”型的,即在每次調(diào)用過程時,局部變量的值保持不變;如果省略“Static”,則局部變量就默認為“自動”的,即在每次調(diào)用過程時,局部變量被初始化為0或空字符串。Static對在過程之外定義的變量沒有影響,即使這些變量在過程中使用。②  Private:表示Sub過程

8、是私有過程,只能被本模塊中的其他過程訪問,不能被其他模塊中的過程訪問。,③ Public:表示Sub過程是公有過程,可以在程序的任何地方調(diào)用它。各窗體通用的過程一般在標準模塊中用Public定義,在窗體層定義的通用過程通常在本窗體模塊中使用,如果在其他窗體模塊中使用,則應(yīng)加上窗體名作為前綴。④  過程名:是一個長度不超過255個字符的變量名,在同一模塊中,同一個變量名不能既用作Sub過程名又用作Funct

9、ion過程名。⑤  參數(shù)表列:含有在調(diào)用時傳遞給該過程的簡單變量名或數(shù)組名,各名字之間用逗號分隔?!皡?shù)表列”指明了調(diào)用時傳遞給過程的參數(shù)的類型和個數(shù),每個參數(shù)的格式為: [ByVal]變量名[()][As數(shù)據(jù)類型],,這里的“變量名”是一個合法的Visual Basic變量名或數(shù)組名,如果是數(shù)組,則要在數(shù)組名后加上一對括號。“數(shù)組類型”指的是變量的類型,可以是Integer、Long、Single、

10、Double、String、Currency、Variant或用戶定義的類型。如果省略“As數(shù)據(jù)類型”,則默認為Variant?!白兞棵鼻懊娴摹癇yVal”是可選的,如果加上“ByVal”,則表明該參數(shù)是“傳值”((即:為值傳遞) Passed by Value)參數(shù),沒有加“ByVal”(或者加ByRef)的參數(shù)稱為“引用” (即:為地址傳遞) (Passed by Reference)參數(shù)。有關(guān)參數(shù)的傳遞問題將在9.3節(jié)介紹。,在

11、定義Sub過程時,“參數(shù)表列”中的參數(shù)稱為“形式參數(shù)”,簡稱“形參”,不能用定長字符串變量或定長字符串數(shù)組作為形式參數(shù)。不過,可以在調(diào)用語句中用簡單定長字符串變量作為“實際參數(shù)”,在調(diào)用Sub過程之前,Visual Basic把它轉(zhuǎn)換為變長字符串變量。(2)End Sub標志著Sub過程的結(jié)束。為了能正確運行,每個Sub過程必須有一個End Sub子句。當程序執(zhí)行到End Sub時,將退出該過程,并立即返回到調(diào)用語句的后繼語句。此外,

12、在過程體內(nèi)可以用一個或多個Exit Sub語句從過程中退出。(3)Sub過程不能嵌套。也就是說,在Sub過程內(nèi),不能再定義Sub過程或Function過程;不能用GoTo語句進入或轉(zhuǎn)出一個Sub過程,只能通過調(diào)用執(zhí)行Sub過程,而且可以嵌套調(diào)用。,下面是一個Sub過程的例子: Sub Tryout(x As Integer,ByVal y As integer) x=x+100 y=y*6

13、 Print x,y End Sub上面的過程有兩個形式參數(shù),其中第二個形參的前面有ByVal,表明該參數(shù)是一個值傳遞參數(shù)。過程可以有參數(shù),也可以不帶任何參數(shù)。沒有參數(shù)的過程稱為無參過程。例如:,Sub ContinueQuery() Do Response$=InputBox$(“Continue(Y or N)?”) If Response$=“N”

14、 Or Response$=“n” Then End If Response$=“Y” Or Response$=“y” Then Exit Do Loop End Sub上述過程沒有參數(shù),當調(diào)用該過程時,詢問用戶是否繼續(xù)某種操作,回答“Y”繼續(xù),回答“N”則結(jié)束程序。對于無參過程,調(diào)用時只寫過程名即可。,2.建立Sub過程 前幾章已涉及如何建立事件過程。通用過程不屬于任何一個事

15、件過程,因此不能放在事件過程中。通用過程可以在標準模塊中建立,也可以在窗體模塊中建立。如果在標準模塊中建立通用過程,可以使用以下兩種方法: 第一種方法,操作步驟如下:(1)執(zhí)行“工程”菜單中的“添加模塊”命令,打開“添加模塊”對話框,在該對話框中選擇“新建”選項卡,然后雙擊“模塊”圖標,打開模塊代碼窗口。(2)執(zhí)行“工具”菜單中的“添加過程”命令,打開“添加過程”對話框。如下圖所示:,圖 “添加過程”對話框,(3)在“名稱”框

16、內(nèi)輸入要建立的過程名字(例如Tryout)。 (4)在“類型”欄內(nèi)選擇要建立的過程的類型,如果建立子程序過程,則應(yīng)選擇“子程序”;如果要建立函數(shù)過程,則應(yīng)選擇“函數(shù)”。 (5)在“范圍”欄內(nèi)選擇過程的適用范圍,可以選擇“公有的”或“私有的”。如果選擇“公有的”,則所建立的過程可用于本工程內(nèi)的所有窗體模塊;如果選擇“私有的”,則所建立的過程只能用于本標準模塊。 (6)單擊“確定”按鈕,回到模塊代碼窗口。   此時可以

17、在Sub和End Sub之間鍵入程序代碼(與事件過程的代碼輸入相同)。,第二種方法:執(zhí)行“工程”菜單中的“添加模塊”命令,打開模塊代碼窗口,鍵入過程的名字。例如,鍵入“ Sub Tryout()”,按回車鍵后顯示: Sub Tryout() End Sub 即可在Sub和End Sub之間鍵入程序代碼。 在模塊代碼窗口中,通用過程出現(xiàn)在“對象”框的“通用”項目下, 其名字可以在“過程”框中找到。,,過程框

18、中自動加入名字Tryout,,模塊代碼窗口,如果在窗體模塊中建立通用過程,則可雙擊窗體進入代碼窗口,在“對象”框中選擇“通用”,在“過程”框中選擇“聲明”,直接在窗口內(nèi)鍵入“Sub Tryout()”,然后按回車鍵,窗口內(nèi)顯示: Sub Tryout() End Sub此時即可鍵入代碼。,直接鍵入Sub Tryout(),但尚未按回車健,屏幕顯示,,3. 調(diào)用Sub過程調(diào)用即為執(zhí)行過程。也就是說,要執(zhí)行一個過程,首先

19、必須調(diào)用該過程。Sub過程的調(diào)用有兩種方式,一種是使用Call語句,一種是把過程名作為一個獨立語句來使用。1) 用Call語句調(diào)用Sub過程格式:Call 過程名[(實際參數(shù))]Call語句把程序控制傳遞到一個Visual Basic的Sub過程。用Call語句調(diào)用一個過程時,如果過程本身沒有參數(shù),則“實際參數(shù)”和括號可以省略;否則應(yīng)給出相應(yīng)的實際參數(shù),并把參數(shù)放在括號中。“實際參數(shù)”(實參)是傳遞給Sub過程的變量或常數(shù)。例如

20、: Call Tryout(a,b),2) 把過程名作為一個語句來使用 在調(diào)用Sub過程時,如果省略關(guān)鍵字Call,就成為調(diào)用Sub過程的第 二種方式。與第一種方式相比,它有兩點不同: (1)去掉了關(guān)鍵字Call; (2)去掉了“實際參數(shù)”的括號。 例如: Tryout a,b,3. 通用過程與事件過程 事

21、件過程也是Sub過程,但它是一種特殊的Sub過程,它附加在窗體和控件上。一個控件的事情過程由控件的實際名字(Name屬性)、下劃線和事件名組成;而窗體事件過程由“Form”、下劃線和事件名組成。也就是說,窗體的事件過程不能由用戶任意定義,而是由系統(tǒng)指定??丶录^程的一般格式為: [Private|Public]Sub 控件名_事件名(參數(shù)表) 語句組 End Sub窗體事件過程的一般格式為:

22、 [Private|Public]Sub Form_事件名(參數(shù)表) 語句組 End Sub,可以看出,除了名字外,控件事件過程與窗體事件過程的格式基本上是一樣的。在大多數(shù)情況下,通常是在事件過程中調(diào)用通用過程。實際上,由于事件過程也是過程(Sub過程),因此也可以被其他過程調(diào)用(包括事件過程和通用過程)。 通用過程可以放在標準模塊中,也可以放在窗體模塊中,而事件過程只能放在窗體模塊中,不同

23、模塊中的過程(包括事件過程和通用過程)可以互相調(diào)用。當過程名唯一時,可以直接通過過程名調(diào)用;如果兩個或兩個以上的標準模塊中含有相同的過程名,則在調(diào)用時必須用模塊名限定,其一般格式為: 模塊名.過程名(參數(shù)表) 一般來說,通用過程(包括Sub過程、Function過程)之間、事件過程之間、通用過程與事件過程之間,都可以互相調(diào)用。,9.2 Function 過程 前面介紹了Sub過程,它不直接返回值,

24、可以作為獨立的基本語句調(diào)用。而Function過程要返回一個值,通常出現(xiàn)在表達式中。這一節(jié)將介紹Function過程的定義和調(diào)用。,1 建立Function過程 Function過程定義的格式如下: [Static][Private][Public]Function過程名[(參數(shù)表列)][As 類型] [語句塊] [過程名=表達式] [Exit Function]

25、 [語句塊] End Function,說明:(1)Function過程以Function開頭,以End Function結(jié)束,在兩者之間是描述過程操作的語句塊,即“過程體”或“函數(shù)體”。格式中的“過程名”、“參數(shù)表列”、“Static”、“Private”、“Public”、“Exit Function”的含義與Sub過程相同?!癆s類型”是Function過程返回值的數(shù)據(jù)類型,可以是Integer、Long、Single、D

26、ouble、Currency或String,如果省略,則為Variant。(2) 調(diào)用Sub過程相當于執(zhí)行一個語句,不直接返回值;而調(diào)用Function過程要返回一個值,因此可以像內(nèi)部函數(shù)一樣在表達式中使用。由Function過程返回的值放在上述格式中的“表達式”中,并通過“過程名=表達式”把它的值賦給“過程名”。如果在Function過程中省略“過程名=表達式”,則該過程返回一個默認值——數(shù)值函數(shù)過程返回0值;字符串函數(shù)過程返回空字

27、符串。因此,為了能使一個Function過程完成所指定的操作,通常要在過程體中至少為“過程名” 賦值一次。,(3)前面講過,過程不能嵌套。因此不能在事件過程中定義通用過程(包括Sub過程和Function過程),只能在事件過程內(nèi)調(diào)用通用過程。 前一節(jié)提到的建立Sub過程的3種方法(兩種方法用于標準模塊,一種方法用于窗體模塊)也可用來建立Function過程,只是當用第一種方法建立時,在對話框的“類型”框內(nèi)應(yīng)選擇“函數(shù)”,另外兩種

28、方法中的Sub應(yīng)換成Function。,2. 調(diào)用Function過程 Function過程的調(diào)用比較簡單,因為可以像使用Visual Basic內(nèi)部函數(shù)一樣來調(diào)用Function過程。實際上,由于Function過程能返回一個值,因此完全可以把它看成是一個函數(shù),它與內(nèi)部函數(shù)(如Sqr、Str$、Chr$等)沒有什么區(qū)別,只不過內(nèi)部函數(shù)由語言系統(tǒng)提供,而Function過程由用戶自己定義。,Visual Basic應(yīng)用程序的過程

29、出現(xiàn)在窗體模塊和標準模塊中。在窗體模塊中可以定義和編寫子程序過程、函數(shù)過程及事件過程。而在標準模塊中只能定義子程序過程和函數(shù)過程。其結(jié)構(gòu)關(guān)系如圖所示:,3 參數(shù)傳送 Sub過程和Function函數(shù)過程中的中的參數(shù)稱為形式參數(shù)(簡稱形參),在程序中調(diào)用Sub過程和Function函數(shù)過程時中的參數(shù)稱為實際參數(shù)(簡稱實參) 。過程的調(diào)用,就是實參與形參結(jié)合的過程。在調(diào)用一個過程時,必須把實參傳遞給過程,完成形參與實參的結(jié)合,然后用實參

30、執(zhí)行調(diào)用的過程。,1 形參與實參 形參是在Sub、Function過程的定義中出現(xiàn)的變量名,實參則是在調(diào)用Sub或Function過程時傳遞給Sub或Function過程的常數(shù)、變量、表達式或數(shù)組。在Visual Basic中,可以通過兩種方式傳遞參數(shù),即按位置傳遞和指名傳遞。 按位置傳送(或遞) 按位置傳遞是大多數(shù)語言處理子程序調(diào)用時所使用的方式,在前面的例子中使用的就是按位置傳遞的方式。當使用這種方式時,實際參數(shù)的順序

31、必須和形式參數(shù)的順序相匹配,也就是說,它們的位置順序必須一致。(個數(shù),類型,順序),例如,定義了一個過程:Sub TestSub(pl As Integer, p2 As Single,p3 As String) ……End Sub可以用下述語句調(diào)用該過程:    Call TestSub(A%,B!,“Tset”)于是就完成了形參與實參的結(jié)合,其關(guān)系如圖所示。,形參與實參,在傳遞參數(shù)時,形參表與實參表中

32、對應(yīng)變量的名字可以不同,但是它們所包含的參數(shù)的個數(shù)必須相同:同時,實參與相應(yīng)形參的類型必須相同。 形參表中各個變量之間用逗號隔開,表中的變量可以是:     除定長字符串之外的合法變量名;    后面跟有左、右括號的數(shù)組名。 在形參表中只能使用形如 X$或X As String 之類的變長字符串作為形參,不能用形如X As Sting

33、*8 之類的定長字符串作為形參,但定長字符串可以作為實際參數(shù)傳遞給過程。,實參表中的各項須用逗號分隔,實參可以是:     常數(shù);     表達式;     合法的變量名;     后面跟有左、右括號的數(shù)組名。 假定有如下的過程定義:Sub TestSub( A

34、 As Integer, Array() As Single, Recvar as Rectype, C As String) 這是帶有形參表的Sub 過程定義的第一行。形參表中的第一個參數(shù)是整型變量;第二個參數(shù)是單精度數(shù)組;第三個參數(shù)是一個Rectype 類型的記錄;第四個參數(shù)是一個字符串。在調(diào)用上述過程時,必須把所需要的實參傳遞給過程,取代相應(yīng)的形參,執(zhí)行過程的操作,實參與形參必須按位置順序傳遞。,用下面的程序段可以調(diào)用過程Te

35、stSub,并把4個實參傳遞給相應(yīng)的形參:Type Rectype Rand As String*12 SerialNum As LongEnd TypeDim Recv AS RectypeCall TestSub(x,A(),Recv,“Dephone”),2.指名傳送(遞) Visual Basic 6.0還提供了指名參數(shù)傳遞方式。 所謂指名參數(shù)傳遞,就是顯式地指出與形參結(jié)合的實參,把形

36、參用“∶﹦ ”與實參連接起來。和按位置傳遞方式不同的是指名傳遞方式不受位置順序的限制。,例如,建立了如下的通用過程:Sub add_num(firstvar As Integer, seconddvar As Integer,thirdvar As Integer) C=(firstvar + seconddvar )*thirdvar Print c End Sub若使用按位置結(jié)合方式,則調(diào)用語句如下:  ad

37、d_num 4,6,8若使用指名參數(shù)傳遞方式,則下面3個調(diào)用語句  add_num firstvar ∶﹦ 4, secondvar ∶﹦ 6,thirdvar ∶﹦ 8  add_num secondvar ∶﹦ 6,firstvar ∶﹦ 4, thirdvar ∶﹦ 8  add_num thirdvar ∶﹦ 8, secondvar ∶﹦ 6,firstvar ∶﹦ 4是等價的。,,表面上看來,指名結(jié)合比

38、按位置結(jié)合繁瑣,因為要多寫一些東西,但它能改善過程調(diào)用的可讀性;此外,當參數(shù)較多,而且類型相似時,指名結(jié)合比按位置結(jié)合出錯的幾率要小一些。對于Visual Basic 提供的方法,可以通過指名參數(shù)進行調(diào)用。但應(yīng)注意,有些方法的調(diào)用不能使用指名參數(shù),在使用時請查閱相關(guān)的幫助信息。,2.引用(即地址傳遞) 在Visual Basic中,參數(shù)通過兩種方式傳遞,即地址傳遞和值傳遞,其中地址傳遞習慣上稱為引用,引用方式通過關(guān)鍵字 ByR

39、ef 來實現(xiàn)。也就是說,在定義通用過程時,結(jié)果形參前面有關(guān)鍵字ByRef(通常省略),則該參數(shù)通過引用(即地址傳遞)方式傳遞。 在默認情況下,變量(簡單變量、數(shù)組或數(shù)組元素以及記錄)都是通過“地址傳遞”的方式傳遞給Sub或 Function 過程。在這種情況下,可以通過改變過程中相應(yīng)的參數(shù)來改變該變量的值。這意味著,當通過引用來傳遞實參時,可以改變傳遞給過程變量的值。,變量(即實參)的值存放在內(nèi)存的某個地址中,當通過引用來調(diào)用一個過

40、程時,向該過程傳遞變量,實際上是把變量的地址傳遞給該過程,因此,變量的地址和被調(diào)用過程中相應(yīng)參數(shù)的地址是相同的。這樣,如果通用過程中的操作修改了參數(shù)的值,則它同時也修改了傳遞給過程的變量的值。如果不希望在調(diào)用過程時改變變量的值,則應(yīng)把變量的值傳遞給參數(shù),即值傳遞,而不要傳遞變更的地址。 可以看出,引用會改變實參的值。如果一個過程能改變實參的值,則稱這樣的過程是有副作用的過程,在使用這種過程時,很容易出現(xiàn)邏輯錯誤。,一般來說,地址傳遞

41、比值傳遞更能節(jié)省內(nèi)存和提高效率。因為在定義通用過程時,過程中的形參只是一個地址,系統(tǒng)不必為保存它的值而分配內(nèi)存空間,只簡單地記住它是一個地址。使用地址傳遞可以使Visual Basic進行更有效的操作。對于整型數(shù)來說,這種效率不太明顯,而對于字符串來說,地址傳遞與值傳遞的區(qū)別就比較大了。假定有下面一個過程: Sub Aside(s As String) Print“(”  Print s;  Print“)

42、” End Sub,這個過程的操作很簡單,即在調(diào)用時傳遞給該過程一個字符串,并把這個字符串放在括號中打印出來。如果使用值傳遞方式,則每次調(diào)用Aside過程時,Visual Basic 都要為每一個字符串分配內(nèi)存空間,并拷貝該字符串。如果字符串由幾百、幾千個字符組成,其傳遞效率是可以想見的。如果只傳遞字符串的地址,則效率要高得多。,3.傳值(即:值傳遞) 值傳遞就是通過值傳遞實際參數(shù),即傳遞的是實參的值而不是傳遞它的地址。在這

43、種情況下,系統(tǒng)把需要傳遞的變量復(fù)制到一個臨時單元中,然后把該臨時單元的地址傳遞給被調(diào)用的通用過程。由于通用過程沒有訪問變量(實參)的原始地址,因而不會改變原來變量的值,所有的變化都是在變量的副本上進行的。 在Visual Basic 中,值傳遞方式通過關(guān)鍵字 ByVal 來實現(xiàn)。也就是說,在定義通用過程時,如果形參前面有關(guān)鍵字 ByVal,則該參數(shù)用的是值傳遞方式傳遞,否則用引用(即地址傳遞)方式傳遞。,例如:Sub Increme

44、nt(ByVal x As Integer) X=x+1 End Sub 這里的形參x前有關(guān)鍵字ByVal,調(diào)用時以值傳遞方式傳遞實參。在值傳遞方式下,Visual Basic為形參分配內(nèi)存空間,并將相應(yīng)的實參值拷貝給各形參。 如果用值傳遞方式編寫通用過程,則運行結(jié)果是不一樣的。改為值傳遞方式的通用過程如下: Sub tryout (ByVal x As Integ

45、er, ByVal y As Integer) X = x + 100 Y = y * 6 Print “x=”;x, “y=”;y End Sub,Private Sub Command1_Click()Dim a As Integer, b As Integer a = 10: b = 20 tryout a, b Print "a="; a,

46、 "b="; bEnd Sub 事件過程From_Click不用作任何修改。程序運行后,輸出結(jié)果如下:  x=110 y=120 a=10 b=20 如前所述,地址傳遞比值傳遞效率高。但在地址傳遞方式中,形參不是一個真正的局部變量,可能對程序的執(zhí)行產(chǎn)生不必要的干擾。而在值傳遞方式中,形參是一個真正的局部變量,當在程序的其他地方使用時,不會對程序產(chǎn)生干擾。在

47、有些情況下,只有用值傳遞方式才能得到正確的結(jié)果。,究竟什么時候用值傳遞方式,什么時候用地址傳遞方式,并沒有硬性規(guī)定,但下面幾條規(guī)則可供參考: (1)在VB中,區(qū)分地址傳遞與值傳遞的標志為:值傳遞時,在實參前加上ByVal,地址傳遞時,在實參前加上Byref或者是默認。(2)對于整型、長整型或單精度參數(shù),如果不希望過程修改實參的值,則應(yīng)加上關(guān)鍵字ByVal(值傳遞)。而為了提高效率,字符串和數(shù)組應(yīng)通過地址傳遞。些外,用戶定義的類型(記

48、錄)和控件只能通過地址傳遞。(3)對于其他數(shù)據(jù)類型,包括雙精度型、貨幣型和變體數(shù)據(jù)類型,可以用兩種方式傳遞。經(jīng)驗證明,此類參數(shù)最好用值傳遞方式傳遞,這樣可以避免錯用參數(shù)。(4)如果沒有把握,最好能用值傳遞方式來傳遞所有變量(字符串、數(shù)組和記錄類型變量除外),在編寫完程序并能正確運行后,再把,部分參數(shù)改為地址傳遞,以加快運行速度。這樣,即使在刪除一些ByVal后程序不能正確運行,也很容易查出錯在什么地方。(5)用Function過程

49、可以通過過程名返回值,但只能返回一個值;Sub過程不能通過過程名返回值,但可以通過參數(shù)返回值,并可以返回多個值。當需要用Sub過程返回值時,其相應(yīng)的參數(shù)要用地址傳遞的方式。,(6)地址傳遞的方式效率比值傳遞方式要高,但形參并不是一個真正的局部變量,有可能對程序的運行產(chǎn)生干擾。值傳遞方式的效率雖然較低,但形參是一個真正的局部變量,不會對程序的運行產(chǎn)生干擾。,ByVal 值傳遞

50、 Byref 地址傳遞,地址傳遞方式與值傳遞方式的示意圖,4.數(shù)組參數(shù)的傳遞 Visual Basic允許把數(shù)組作為實參傳送到過程中。例如,定義了如下過程: Sub S(a(),b()) …… End Sub 該過程有兩個形參,這兩個參數(shù)都是數(shù)組。注意,用數(shù)組作為過程的參數(shù)時,應(yīng)在數(shù)組名的后面加上一對括號,以免與普通變量相混淆??梢杂孟旅娴恼Z句調(diào)用該過程:

51、 Call S(p(),q()),,這樣就把數(shù)組p和q傳送給過程中的數(shù)組a和b。當用數(shù)組作為過程的參數(shù)時,使用的是“地址傳遞”方式,而不是“值傳遞”方式,即不是把p數(shù)組中各元素的值一一傳遞給過程的a數(shù)組,而是把p數(shù)組的起始地址傳遞給過程,使a數(shù)組也具有與p數(shù)組相同的起始地址。,設(shè)p數(shù)組有8個元素,在內(nèi)存中的起始地址為5000。在調(diào)用S時,進行“形實結(jié)合”,將p的起始地址5000傳遞給a。因此,在執(zhí)行該過程期間,p和a同占一段內(nèi)存單元

52、,p數(shù)組中的值與a數(shù)組共享,如a(1)的值就是p(1)的值,都是2。如果在過程S中改變了a數(shù)組的值,例如: a(4)=20 則在執(zhí)行完過程S后,主程序中數(shù)組p的第4個元素p(4)的值也變?yōu)?0了。也就是說,用數(shù)組作過程參數(shù)時,形參數(shù)組中各元素的改變將被帶回到實參。這個特性是很有用的。 如前所述,數(shù)組一般通過地址傳遞方式傳遞。在傳遞數(shù)組時,除遵守參數(shù)傳遞的一般規(guī)則外,還應(yīng)注意以下幾點:,(1)為了把一個數(shù)組的全部元素傳遞給

53、一個過程,應(yīng)將數(shù)組名分別放入實參表和形參表中,并略去數(shù)組的上下界,但括號不能省略。,(2)如果不需要把整個數(shù)組傳送給通用過程,可以只傳遞指定的單個元素,這需要在數(shù)組名后面的括號中寫上指定元素的下標。例如:  Dim test_array() As Integer Static Sub Sqval (a) a=Sqr(Abs(a)) End Sub,(3) 前一章介紹的Lbound和

54、Ubound函數(shù)常用來確定傳遞給過程的數(shù)組大小。用LBound函數(shù)可以求出數(shù)組的下標下界值,而用UBound函數(shù)可以求出數(shù)組的下標上界值,這樣就能確定傳遞給過程的數(shù)組中各維的上下界。例如: Static Sub Printout (a()) For row = LBound (a,1) To UBound (a,1) For col = LBound (a,2) To UBound (a,2)

55、 Print a (row,col) Next col Next row End Sub 上述過程用Lbound函數(shù)把row 和col初始化為數(shù)組a中各維的下界,同時用UBound 函數(shù)把For循環(huán)執(zhí)行的次數(shù)限制為數(shù)組元素的個數(shù)。,以上介紹了Visual Basic 過程的參數(shù)傳遞,現(xiàn)補充說明以下幾點: (1) 當把常數(shù)和表達式作為實參傳遞給形參時,應(yīng)注意

56、類型匹配。通常有以下3種情況: ①字符串常數(shù)和數(shù)值常數(shù)分別傳遞給字符串類型的形參和數(shù)值類型的形參。 ②傳遞數(shù)值常數(shù)時,如果實參表中的某個數(shù)值常數(shù)的類型與 Function或Sub過程形參表中相應(yīng)的形參類型不一致,則這個常數(shù)被強制變?yōu)橄鄳?yīng)形參的類型。 ③當作為實參的數(shù)值表達式與形參類型不一致時,通常也強制變?yōu)橄鄳?yīng)的形參的類型。,(2)記錄是用戶定義的類型,傳遞記錄實際上是傳遞記錄類型的變量,一般步驟如下:①

57、 定義記錄類型。例如: Type StockItem PartNumber As String*8 Description As String*20 UnitPrice As Single Quantity As Integer End Type ② 定義記錄類型變量。例如:  Dim StockRecord As StockItem ③ 調(diào)用過

58、程,并把定義的記錄變量傳遞到過程。例如:  Call FindRecord (RecordVar As StockItem),,(3) 單個記錄元素的傳遞。傳遞單個記錄元素時,必須把記錄元素放在實參表中,寫成“記錄名.元素名”的形式。例如:  Sub PrintPriceteg(Desc As String,Price As Single) ……  End Sub …… Dim StockRecor

59、d As StockItem Call PrintPriceteg(StockRecord.Description,StockRecord.UnitPrice) ……,4. 可選參數(shù)與可變參數(shù) Visual Basic 6.0 提供了十分靈活和安全的參數(shù)傳遞方式,允許使用可選參數(shù)和可變參數(shù)。在調(diào)用一個過程時,可以向過程傳遞可選的參數(shù)或者任意數(shù)量的參數(shù)。,1. 可選參數(shù) 在前面的例子中,一個過程中的形式參數(shù)

60、是固定的,調(diào)用時提供的實參也是固定。也就是說,如果一個過程有3個形參,則調(diào)用時必須按相同的順序和類型提供3個實參。在Visual Basic 6.0中,可以指定一個或多個參數(shù)作為可選參數(shù)。例如,假定建立了一個計算兩個數(shù)的乘積的過程,它能可選擇地乘以第三個數(shù)。在調(diào)用時,既可以給它傳遞兩個參數(shù),也可以給它傳遞3個參數(shù)。 為了定義帶可選參數(shù)的過程,必須在參數(shù)表中使用Optional關(guān)鍵字,并在過程體中通過IsMissing函數(shù)測試調(diào)用時是

61、否傳遞可選參數(shù)。,例如: Sub Multi (fir As Integer,sec As Integer,Optional third ) n = fir * sec ‘Optional third 表明third是一個可選參數(shù),且為 Variant型 If Not IsMissing(third) Then n = n * third

62、 End If Print n End Sub 上述過程有3個參數(shù),其中前兩個參數(shù)與普通過程中的書寫格式相同,最后一個參數(shù)沒有指定類型(使用默認類型Variant),而是在前面加上“Optional”,表明該參數(shù)是一個可選參數(shù)。,在過程體中,首先計算前兩個參數(shù)的乘積,并把結(jié)果賦給變量 n,然后測試第三個參數(shù)是否存在,如果存在,則把第三個參數(shù)與前兩個參數(shù)的乘積相乘,輸出乘積。 在調(diào)用上述過

63、程時,可以提供兩個參數(shù),也可以提供3個參數(shù),都能得到正確的結(jié)果。 例如,如果用下面的事件過程調(diào)用: Private Sub Form_Click() Multi 10,20 End Sub則結(jié)果為200;而如果用下面的過程調(diào)用: Private Sub Form_Click() Multi 10,20,30 End Sub則結(jié)果為6000。,上述過程可以只有一個可選參數(shù),

64、也可以有兩個或多個。但應(yīng)注意,可選參數(shù)必須放在參數(shù)表的最后,而且必須是Variant類型。 可選參數(shù)過程通過Optional指定可選的參數(shù),其類型必須是Variant;通過IsMissing函數(shù)測試是否向可選參數(shù)傳遞實參值。IsMissing函數(shù)有一個參數(shù),它就是由Optional指定的形參的名字,其返回值為Boolean類型。在調(diào)用過程時,如果沒有向可選參數(shù)傳遞實參,則Ismissing函數(shù)的返回值為True,否則返回值為Fals

65、e.,2.可變參數(shù) 在C語言中,通常用預(yù)定義函數(shù)printf 輸出數(shù)據(jù)。用該函數(shù)可以輸出一個數(shù)據(jù),也可以輸出任意多個數(shù)據(jù)。輸出的數(shù)據(jù)就是函數(shù)的參數(shù),因此printf是一個可變參數(shù)函數(shù)。在Visual Basic 6.0中,可以建立與printf 類似的過程。 可變參數(shù)過程通過ParamArray命令來定義,一般格式為:  Sub過程名(ParamArray 數(shù)組名) 這里的“數(shù)組名”是一個形式參數(shù),只有名字和括號

66、,沒有上下界。由于省略了變量類型,“數(shù)組”的類型默認為Variant. 前面建立的Multi過程可以求兩個或3個數(shù)的乘積。下面定義的是一個可變參數(shù)過程,用這個過程可以求任意多個數(shù)的乘積。,Sub Multi (ParamArray Numbers()) n = 1 For Each x In Numbers ‘根據(jù)Numbers成員的個數(shù),決定循環(huán)的次數(shù) n = n * x Next x

67、 Print n End Sub在該過程中使用了For Each …Next 語句,具體用法見第8章。,可以用任意個參數(shù)調(diào)用上述過程。例如: Private Sub Form_Click() Multi 2,3,4,5,6 End Sub 輸出結(jié)果為720 由于可變參數(shù)過程中的參數(shù)是Variant類型,因此可以把任何類型的實參傳遞給該過程。例如: Private Sub

68、Form_Click() Dim a As Integer,b As Long,c As Variant,d As Integer a=6 : b=8 c=12 : d=2 Multi a,b,c,d End Sub,9.5  對象參數(shù)  和傳統(tǒng)的程序設(shè)計語言一樣,通用過程一般用變量作為形式參數(shù)。但是,和傳統(tǒng)的程序設(shè)計語言不同,V

69、isual Basic還允許用對象,即窗體或控件作為通用過程的參數(shù)。在有些情況下,這可以簡化程序設(shè)計,提高效率。這一節(jié)將介紹用窗體和控件作為通用過程參數(shù)的操作。 前面已經(jīng)介紹了用數(shù)值、字符串、數(shù)組作為過程的參數(shù),以及如何把這些類型的實參傳遞給過程。實際上,在Visual Basic中,還可以向過程傳遞對象,包括窗體和控件。,用對象作為參數(shù)與用其他數(shù)據(jù)類型作為參數(shù)的過程沒有什么區(qū)別,其格式為: Sub 過程名(形參表)  語句

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論