APP下载

解析Visual Basic过程调用中参数传递方式

2014-04-29蒲会兰丁世文李敏之张永花

计算机时代 2014年10期
关键词:内存

蒲会兰 丁世文 李敏之 张永花

摘 要: 过程调用作为Visual Basic程序设计的难点及重点之一,初学者对其中不同参数传递方式很难理解和掌握。为此提出了过程调用结合内存管理的新教学方法,将内存概念引入过程调用,通过分析计算机内存管理和Visual Basic程序运行的相互关系,对过程间不同参数的传递方式进行了解析,将抽象的过程执行步骤以直观的内存管理图示表现出来,帮助学生理解Visual Basic过程调用中的参数传递方式。该方法在教学实践中取得了良好的效果。

关键词: Visual Basic; 内存; 过程调用; 实际参数; 形式参数; 参数传递

中图分类号: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语言为基础,以可视化设计工具为界面设计,以事件驱动为运行机制的高级程序设计语言,已被高校作为部分非计算机专业的入门课程。过程调用是VB程序设计的难点及重点之一,初学者对过程调用中不同参数传递方式很难理解和掌握。本文针对该课程教学难点,结合多年的实践教学经验,将内存概念引入过程调用,通过直观的内存管理图帮助学生理解VB过程调用中的参数传递方式,在教学实践中取得了良好的效果。

1 基本概念

过程是VB程序的基本组成单位,每个过程是为了完成一定的任务,由一组独立的程序代码组成。在VB中除了系统提供的内部函数过程和事件过程外,用户可根据要解决的问题,定义Sub子过程和Function函数过程。

要执行子过程中的代码或获得函数过程的返回值,只能通过调用过程完成,在调用过程时,被调过程可以接收主调过程传递过来的参数,并能根据接收到的参数控制程序流程或对接收到的参数进行处理。主调过程中的参数称为实际参数,简称实参,实参可以是常量、变量、表达式、数组名、数组元素等;被调过程中的参数称为形式参数,简称形参,形参一般为内存变量或数组名。在Visual Basic过程调用中,参数传递方式分为“传值”和“传地址”两种[1-4]。

2 内存概念在过程调用中的应用

运行VB程序时,系统将根据变量或数组的数据类型,为其分配相应的内存单元,以便存储它们的内容,内存区的每一个存储单元有一个编号,即内存单元的“地址”,程序中的各种操作在内存中均表现为对内存单元的读写操作[5]。本文通过动态展现过程调用中内存单元的变化情况,帮助学生理解“传值”方式和“传地址”方式的不同之处,使这一难点迎刃而解。

用户根据要解决的问题可定义两种过程:当过程有多个返回值或无返回值时,常用子过程;当过程有一个返回值时,函数过程比较直观。由于在两种过程调用中参数传递机制相同,故本文不妨以子过程的定义、调用和参数传递为例进行探讨。

2.1 子过程的定义和调用

子过程的定义形式如下[1-3]:

[ Public | Private ]Sub 子过程名([形参列表])

局部变量或常数定义

语句块

End Sub

其中,形参列表指明了参数的类型和个数,每个参数的形式为:

[ ByVal | ByRef ]形参名[()][As 类型]

形参名,简称形参或哑元,只能是变量或数组名,用于在调用该过程时的数据传递;变量名前的[ ByVal | ByRef ]是可选的,默认为ByRef,表示形参是地址传递;ByVal表示形参是值传递。

子过程的调用形式如下[1-3]:

【形式1】call子过程名[(实参列表)]

【形式2】子过程名[实参列表]

其中,实参列表简称实参,它的个数应与形参的个数保持相同;其位置、类型与形参一一对应。【形式1】中,若无实参,则省略括号,若有实参,则实参必须加括号;【形式2】中实参无需加括号。

2.2 参数传递方式

调用过程时,一般将主调过程的实参传递给被调过程的形参,完成实参与形参的结合,然后执行被调过程体。实参与形参的结合有“传值”与“传地址”两种方式。

2.2.1 传值

在定义过程时,若采用传值方式,则调用过程时,系统为形参开辟临时存储区,将各实参值复制给形参,有如下过程:

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的功能是交换形式参数a、b的值。Command1_Click()事件过程中的语句Call swap1(x,y)是过程调用语句,被调过程中形参是传值方式,执行过程,运行结果如下。

通过内存管理图分析过程调用:调用过程前系统只为实参x和y分配内存单元,其地址假定为2000和2004,如图1所示;调用过程时,系统根据形参a和b的类型为其临时分配内存单元,并将主调过程实参的值一一复制到被调过程对应形参的内存单元中,即形参获得了实参的值,如图2所示;当执行swap1过程时,由于实参与形参已断开了联系,即实参、形参占用不同的内存单元,形参值的变化不会影响实参值,如图3所示;过程调用结束时,形参所占内存单元被释放,实参x和y的值并未交换,如图4所示。

[2000][2004][x][y][\&6\&\&8\&\&] [3000][3004][a][b][2000][2004][x][y][\&6\&\&8\&\&][\&6\&\&8\&\&]

图1 过程调用前内存图 图2 参数传递示意图

[3000][3004][a][b][2000][2004][x][y][\&6\&\&8\&\&][\&8\&\&6\&6\&][3006][t] [2000][2004][x][y][\&6\&\&8\&\&]

图3 执行swap1过程示意图 图4 过程调用后内存图

2.2.2 传地址

⑴ 内存变量作为过程参数

在定义过程时,若采用传地址方式,则调用过程时,系统将各实参的地址传递给形参,形参、实参具有相同的地址,即形参变量与实参变量共用相同的存储单元,在被调用过程中对形参的任何操作将变成了对相应实参的操作。过程如下所示:

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的功能是交换形式参数a、b的值,形参采用“传地址”方式,在Command2_Click()事件过程中调用过程swap2,执行过程,运行结果如下:

通过内存管理图分析调用过程:调用过程前系统仅为实参x和y分配内存单元,其地址假定为2000和2004,如图5所示;调用过程时,由于形参前的关键字为“ByRef”,即采用传地址方式,因此形参和实参结合时,不是把实参的值传递给形参,而是将实参的地址传给形参,使形参和实参具有相同的地址,占有相同的内存单元,即x和a、y和b占有相同的内存单元,如图6所示;执行swap2过程,形参值进行交换,即对实参x和y的内存单元值进行修改,如图7所示;所以过程调用结束时实参x和y的值已被交换,如图8所示。

[2000][2004][x][y][\&6\&\&8\&\&] [2000][2004][x][y][\&6\&\&8\&\&][a][b]

图5 调用过程前内存图 图6 参数传递示意图

[2000][2004][x][y][\&8\&\&6\&6\&][a][b][t][2006] [2000][2004][x][y][\&8\&\&6\&\&]

图7 执行swap2过程示意图 图8 调用过程后内存图

⑵ 数组作为过程参数

数组作为过程参数传递时,也采用传地址方式,在调用过程时,系统把实参数组的首地址传给形参数组,使形参数组也具有与实参数组相同的首地址,由于形参数组和实参数组各元素共用相同的内存单元,对形参数组中某一元素的操作将影响实参数组中的对应元素。过程如下所示:

Sub sort(a())

Dim i%, j%, mini%, t%

For i=1 To UBound(a)-1

mini=i

For j=i+1 To UBound(a)

If a(j)

Next j

t=a(i): a(i)=a(mini): a(mini)=t

Next i

End Sub

Option Base 1 '在通用部分声明数组下标从1开始

Private Sub Command3_Click()

Dim x(), i%

x=Array(5, 4, 1, 2, 8, 7)

Print "调用sort前,数组元素:"

For i=1 To UBound(x)

Print x(i);

Next i

Call sort(x)

Print

Print "调用sort后,数组元素:"

For i=1 To UBound(x)

Print x(i);

Next i

End Sub

子过程sort的功能是对形参数组元素进行升序排列,在Command3_Click()事件过程中调用该过程,形参是一个不指出元素个数的数组,采用传地址方式,运行结果如下:

通过内存管理图分析过程调用:调用过程前系统只为实参数组x分配内存单元,其首地址假定为2000,如图9所示;调用sort过程,形参数组a和实参数组x结合时,不是把实参数组x的各个元素值逐个复制到相应的形参数组a,而是将实参数组的首地址传送给相应的形参数组,即形参数组首元素a(1)和实参数组首元素x(1)占用相同的内存单元,如图10所示,同理,a(n)和x(n)共享同一内存单元;执行sort过程,改变数组a中各元素的值时也改变了数组x对应元素的值,如图11所示;当sort过程执行结束时,实参数组x的元素已升序排列,如图12所示。

[5\&4\&1\&2\&8\&7\&] [2000][x(1)][x(2)][x(3)][x(4)][x(5)][x(6)][x] [5\&4\&1\&2\&8\&7\&] [2000][x(1)][x(2)][x(3)][x(4)][x(5)][x(6)][x][a][a(1)][a(2)][a(3)][a(4)][a(5)][a(6)]

图9 过程调用前内存图 图10 参数传递示意图

[1\&2\&4\&5\&7\&8\&] [2000][x(1)][x(2)][x(3)][x(4)][x(5)][x(6)][x][a][a(1)][a(2)][a(3)][a(4)][a(5)][a(6)] [1\&2\&4\&5\&7\&8\&] [2000][x(1)][x(2)][x(3)][x(4)][x(5)][x(6)][x]

图11 执行sort过程示意图 图12 过程调用后内存图

3 结束语

参数传递选用传值还是传地址的一般考虑是:若要被调过程改变实参的值,则形参必须是传地址方式;若不希望被调过程体修改实参的值,则应选用传值方式。

⑴ “传值”方式:调用过程时,系统为形参分配临时存储单元,将各实参值复制给形参,之后实参与形参断开了联系,在被调过程体内对形参的操作不会影响到实参,“传值”是单向的。其形参形式为:ByVal 形参变量,实参为变量、常量、表达式、数组元素等。

⑵ “传地址”方式:调用过程时,若形参为变量,系统将各实参的地址传递给形参,形参、实参共用相同的内存单元;若形参为数组,系统将实参数组的起始地址传递给形参,使形参数组具有与实参数组相同的起始地址,形参数组和实参数组各元素共用相同的内存单元。因此,在“传地址”方式中,被调过程体中对形参的操作,变成了对相应实参的操作,形参值变化使得实参的值也变化。其形参形式为:[ByRef] 形参变量或数组,实参是变量或数组,不能是常量、表达式。

本文针对初学者在学习VB过程调用中存在的问题,将内存的概念引入过程调用,让学生通过直观的内存管理图来理解过程调用中的参数传递方式,该方法已在实际教学中运用。实践表明,内存管理图对帮助学生理解和掌握过程调用中的参数传递方式效果良好。

参考文献:

[1] 龚沛曾,杨志强等著.Visual Basic程序设计教程(第4版)[M].高等教育

出版社,2013.

[2] 林卓然.VB语言程序设计(第2版)[M].电子工业出版社, 2009.

[3] 杨忠宝,康顺哲.VB语言程序设计教程[M].人民邮电出版社,2010.

[4] 教育部考试中心.全国计算机等级考试二级教程二级VB语言程序

设计教程(2013年版)[M].高等教育出版社,2013.

[5] 白中英.计算机组成原理(第4版)[M].科学出版社,2007.

猜你喜欢

内存
外部高速缓存与非易失内存结合的混合内存体系结构特性评测
“春夏秋冬”的内存
内存搭配DDR4、DDR3L还是DDR3?
基于内存的地理信息访问技术
基于多级缓存的内存管理方案
上网本为什么只有1GB?