首页 百科知识 过程和用户自定义函数

过程和用户自定义函数

时间:2022-10-21 百科知识 版权反馈
【摘要】:在编写程序时,将可能多次重复使用的、有特定功能的程序模块或能单独使用的程序,编制成可供其他程序调用的独立程序段,称为子程序;VFP中的过程和用户自定义函数也属于子程序。将若干个过程或用户自定义函数归并到一个程序中,可以同时调入内存,以减少读盘的次数,提高运行速度,这个程序文件称为过程文件。

7.4 过程和用户自定义函数

在编写程序时,将可能多次重复使用的、有特定功能的程序模块或能单独使用的程序,编制成可供其他程序调用的独立程序段,称为子程序;VFP中的过程和用户自定义函数也属于子程序。在VFP中,过程和函数的区别不大。

一、过程和用户自定义函数的创建与调用

通常,把经常执行的功能的一段代码独立出来,创建一个过程或函数。这样,如果在一个程序中多次用到该功能,就不必多次编写代码,只需调用这个过程或函数即可。这样减少了代码量,也使程序易读易维护。这正是结构化程序设计方法的精髓所在。

但是,VFP支持面向对象的程序设计方法,其精髓是类和对象的使用。因此,上述结构化设计方法只能用于一般的程序文件或对象的事件和方法代码中。使用VFP进行程序设计时,应尽量使用类的继承性来实现功能的重用。

1.过程的定义:

PROCEDURE <过程名>

命令组

ENDPROC

在命令组语句之后,过程自动执行一条隐含的RETURN命令,也可以在过程最后一行中包含RETURN命令。

2.函数的定义:

FUNCTION<函数名>

命令组

ENDFUNC

3.过程文件

将若干个过程或用户自定义函数归并到一个程序中,可以同时调入内存,以减少读盘的次数,提高运行速度,这个程序文件称为过程文件。

(1)用SET PROCEDURE TO <过程文件名>打开一个过程文件,然后才可以调用过程,使用完后,必须关闭过程。

(2)用命令CLOSE PROCEDURE关闭过程。

4.调用过程或函数

(1)可以将过程和函数保存在独立的程序文件中,也可以放在一般程序的底部,但不能把可执行的主程序代码放在过程和函数之后;

(2)如果创建的过程或函数是用来处理数据库中的表,如为记录的有效性规则创建的过程,可以将过程保存在数据库的存储过程中;

(3)调用过程,一般用DO命令,调用一个函数,则与VFP中的标准函数的调用方法完全相同,可直接用该函数的名称和随后的一对括号来调用。在VFP中可以用DO命令调用函数,也可以用调用函数的方法调用过程。

例7-10:调用过程和函数。

CLEAR

? "用DO proc1的形式调用过程proc1"

DO proc1

? "用proc1()的形式调用过程proc1"

proc1()

? "用DO func1的形式调用函数func1"

DO func1

? "用func1()的形式调用函数func1"

func1()

RETURN

****************************************

*定义过程proc1

PROCEDURE proc1

?"运行Visual FoxPro过程proc1"

RETURN

*定义用户自定义函数func1

FUNCTION func1

?"运行用户自定义函数func1"

RETURN

例7-11:使用过程文件,调用过程。

img237

以下过程文件procfile.prg中包含一个函数和一个过程。

FUNCTION f1

? "运行函数"

ENDFUNC

PROCEDURE p1

? "运行过程"

ENDPROC

二、参数传递

1.向过程或函数传递参数

为了使过程或用户自定义函数具有一定的灵活性,可以向过程或函数传递一些参数,使得函数根据接受到的不同参数返回不同的值。

(1)参数的接收

为了使一个过程或用户自定义函数能够接收一定的参数,在PROCEDURE或FUNCTION命令后面的第一个可执行语句必须是PARAMETERS语句。语法如下:

PARAMETERSE<参数表>

<参数表>指定接收数据的内存变量或数组的列表,其中的参数用逗号分隔,最多可传递27个参数。例如:

PROCEDURE myfunction

PARAMETERS p1,p2,p3

*...

ENDPROC

(2)调用时使用参数

当使用DO命令调用一个过程时,可以使用WITH子句传递参数;按函数方式调用时,则在括号内填写相应的参数。如:

DO myfunction WITH tp1,tp2,tp3

或:

=myfunction(tp1,tp2,tp3)

上面所举参数传递的例子中,在主调程序一方的参数称为“实际参数”,在被调用程序一方的参数称为“形式参数”。

自定义函数并非一定要有参数传递的行为,当有“实际参数”就一定要有“形式参数”,否则将发生错误。但是有形式参数并不一定要有实际参数。

在VFP中,传递给过程或函数的参数数量是可变的,可用PARAMETERS()函数返回传递给最近执行程序的参数数目。

在调用过程或函数时,传递的参数数目一般应与PARAMETERS语句中的参数数目相等。也可以少于PARAMETERS语句中的参数数目,在这种情况下,剩余的形式参数就被初始化为“假”(.F.),若实际参数多于PARAMETERS语句中的形式参数,则VFP将产生“错误的参数数目”的错误信息。

2.参数传递的两种方式

有两种方式将参数传送给过程或函数:引用传递方式和值传递方式。

引用传递方式即地址传递方式是将作为参数的变量和数组元素的地址传递给过程或函数,由于主调程序的实际参数与被调程序的形式参数使用了相同的存储器地址,当形式参数的内容一经改变,实际参数的内容也跟着改变,相当于将参数值传递该主调程序中相关的变量或数组元素。

值传递方式是把变量和数组元素的值直接传递给过程或函数,当过程或函数中参数的值发生变化时,原来的变量或数组元素的值不发生变化。

默认情况下,用DO命令调用过程或函数时的参数传递是引用传递,以函数调用的方式调用过程或函数时的参数传递是值传递。

例7-12:参数的引用传递。

CLEAR

p=10

DO func1 WITH p

img238

************

RETURN

FUNCTION func1

parameters p1

img239

RETURN

3.改变传递方式

有两种方法可以改变默认的参数传递方法:

(1)使用SET UDFPARMS TO命令来强制改变自定义函数的参数传递方式。

①若要按引用方式传递参数,在调用用户自定义函数之前,先执行如下命令:

SET UDFPARMS TO REFERENCE

②若要按值方式传递参数,在调用用户自定义函数之前,先执行如下命令:

SET UDFPARMS TO VALUE

例7-13:按值传递和引用传递内存变量。

CLEAR

fact=10

img240

square(fact)

?"函数返回值改变实参:",ltrim(str(fact))

fact=10

img241

square(fact)

?"函数返回值不改变实参:",ltrim(str(fact))

RETURN

***定义square函数,计算实在参数的平方***

FUNCTION square

parameters void

void=void*void

RETURN

(2)使用@来强制采用地址传递方式。

如上例的主程序部分改为:fact=100

img242

?"函数返回值改变实参:",ltrim(str(fact))

(3)用“()”号来强制采用值传递方式。

如上例的主程序部分改为:

CLEAR

fact=10

img243

?"函数返回值不改变实参:",ltrim(str(fact))

SET UDFPARMS命令改变整个程序中参数传递规则,而强制方式只能改变当前语句的传递方式。

三、函数的返回值

函数用RETURN命令将值返回到主程序,命令格式:

RETURN[eExpression|TO MASTER|TO ProcedureName]

命令功能:

该命令用于结束所在程序的执行,如果该程序被另外一个程序调用,那么系统将程序控制返回到调用程序,并执行调用处的下一条语句;如果该程序没有被另外一个程序调用,那么系统将程序控制返回到命令窗口。

命令说明:

①eExpression参数是一个表达式,用于将表达式的值作为函数值返回到调用程序。eExpression参数适用于用户自定义函数。

②TO MASTER子句用于将程序控制直接返回到主程序。如果省略该子句,那么系统将逐层返回。

③TO ProcedureName子句用于将程序控制返回到指定的过程。ProcedureName参数为过程名。

在用户自定义函数中,返回值可由“函数”、“变量”、“表达式”、“常数”等所组成,如果在RETURN命令后未加入任何值,将会自动返回.T.,且一次只能返回一个数据。如:

img244

例7-14:定义一个函数ntoc(),当传递给一个0~9之间的阿拉伯数字时,返回一个中文的“零~九”。

img245

***函数ntoc接受输入阿拉伯数字0~9,返回中文零~九

FUNCTION ntoc

Parameters p Digit

LOCAL cString

cString="零一二三四五六七八九"

RETURN substr(cString,p Digit*2+1,2)

四、子程序

子程序是结构化程序设计的主要特点,一个应用程序的许多功能可以编写成一个个独立的子程序、过程或用户自定义函数,然后把它们组装到一个主程序中。在一个VFP程序中,可以用DO命令调用其他的程序。一个主程序可以调用任意多个子程序。子程序还可以再调用其他的子程序,VFP允许嵌套的DO调用层数为128层。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈