VFP-04-06-变量作用域、自定义函数

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

变量作用域、自定义函数
4.5.3 内存变量的作用域
变量的作用域:变量的作范围。

程序由模块(主、子程序)组成,模块中有内存变量,内存变量有作用范围。

变量的作用域,从定义变量处开始,一直向下。

1.定义全局内存变量
全局变量既可以是单个变量,也可以是数组。

分别以下列格式定义。

格式1:Public <内存变量表>
格式2:Public <数组名1>(上界1[,上界2[, ...])[,…]
功能:定义全局变量。

①<内存变量表>中既可含普通变量,也可含数组。

②全局变量不会自动释放。

只能用release命令显式释放,或退出VFP。

③VFP命令窗口中定义的变量,默认为全局变量。

④全局数组的每个元素都是全局的。

第116页,例 4.35主程序中使用子程序中定义的全局变量。

*文件名Main.prg
set talk off
clear
clear memory &&清除所有内存变量
I=2 &&默认是私有的
Do ABC
?"主程序中的输出结果:"
?"I="+str(I,2)+" J="+str(J,2)
set talk on
return
*---------------------
Procedure ABC
public J
J=I*8
J=J+5
?"过程中的输出结果:"
?"I="+str(I,2)+" J="+str(J,2)
return
小提示:要检测全局变量,请先clear memory以排除干扰。

2.定义局部内存变量
(1)什么叫局部?
更小的范围就是局部。

对于一个模块,更后的部分是局部。

对于主程序,子程序是局部。

(2)Private定义局部变量
格式1:Private <内存变量表>
格式2:Private <数组名1>(上界1[,上界2[, ...])[,…]
功能:定义局部变量。

①未经定义的变量,默认是局部(Private)的。

③无论全局还是局部变量,无初值的,一律自动赋初值.F.。

③局部变量作用域的子模块扩展规则
Private变量的作用域,通过调用子模块而扩展到子模块中。

图4-20 Private变量作用域子模块扩展规则
第117页,例 4.36子程序中的局部变量,在主程序中找不到。

R=100 &&默认为Private变量
Do Sub1 &&调用子程序
?P &&主程序中找不到这个变量
Return
*-------------------
procedure Sub1
P=2*3.14*R &&主程序中的Private变量,子程序中可用
return
3.Private隐藏内存变量的功能
(1)同名变量就近使用规则(原理)
程序中,对于同名的变量,默认使用最近的。

因此,
①字段变量(因为在当前工作区内)优先于(即隐藏)同名内存变量;注:什么叫隐藏?就是被遮住,看不见,用不上。

图4-22 字段变量隐藏同名内存变量
例如 use student.dbf
use student.dbf
?学号 &&结果是字段变量“学号”值,如“960106”
学号="abcd" &&“=”号赋值,只给内存变量赋值
?学号 &&结果还是优先使用字段变量
?m.学号 &&特别用“m.”指明内存变量,结果才是“abcd”
②同一模块内,小局部存变量优先于(即隐藏)大局部同名内存变量;
图4-23 Private变量隐藏同模块同名变量
③不同模块中,子模块局部内存变量优先于(即隐藏)主模块同名内存变量。

图4-26 用Private隐隐藏变量
小提示:主程序中的private变量,子程序同样可以用private屏蔽。

(3)为什么大范围定义的局部变量,小范围中再定义为全局变量会出错?
因为那样,与Private的隐藏功能相矛盾。

第118页,例 4.37子程序中的同名局部变量隐藏主程序中同名变量。

R=100 &&默认为Private变量
P=10 &&默认为Private变量
Do Sub2 &&调用子程序
?P &&仍是主程序中的值
Return
*-------------------
procedure Sub2
Private P &&局部变量,主程序中的同名变量被屏蔽
P=2*3.14*R &&主程序中的Private变量,子程序中可用
Return
*(5)有没有不通过子程序扩展作用域的变量?
有,Local变量,即本地变量。

如:Local x,y,z。

小提示:采用Local变量,是向C语言靠拢。

4.调用过程时的数据传递
教学提示:VFP的参数传递,过程中默认传址,函数中默认传值。

向过程传递数据,有两种方法。

(1)利用Private变量的作用域扩展规则,不传而传
过程中,可以直接使用主程序中的Private变量,不必传。

第118页,例 4.38计算矩形面积。

G=8 &&长
K=6 &&宽
mj=0 &&面积
do sub3
?Mj
return
*--------------
procedure sub3
mj=G*K
return
(2)在过程第一句用Parameters接收参数
主程序中传出参数格式:Do <过程名> With <实际参数表>
子程序中接收参数格式: Parameters <内存变量表>
说明:
①子程序中,Parameters必须是第一句。

Parameters变量是Private变量。

②传值:Parameters后的变量与主程序中对应的实际参数无关。

③传引用:Parameters后的变量与主程序中对应的实际参数是同一个变量,名称可能不同而已,同时变化。

④引用隐藏实参规则
子模块中,引用参数隐藏实际参数,是因为引用参数与实际参数是同一个变量,只是在子模块中另取了一个名字(别名)而已。

因此,原来的实际参数被隐藏,才不会混乱,包括实际参数是Public变量的情况。

⑤如何决定传值、传地址?由实际参数决定。

过程的实际参数默认引用。

要传值须实际参数加“()”,或者写成表达式。

图4-27 传值与传引用
第119页,例 4.39写程序运行结果。

set talk off
x=1
y=3
do sub4 with x,(y),5
?x,y
return
*----------------
Procedure sub4
parameters a,b,c
a=a+b+c
b=a+b-c
return
&&答: 9, 3
第120页,例 4.40利用一个过程计算矩形面积,要求在主程序输出该面积值。

set talk off
clear
input "矩形长:" to L
input "矩形宽:" to W
S=0
do Area with L,W,S
?"矩形面积:",S
return
*--------------
Procedure Area
Parameters C,K,M
M=C*K
return
4.5.4 自定义函数
1.自定义函数的结构
自定义函数实际上是一个过程,只不过其Return语句后带有表达式,能向主函数返回值。

格式:
Function <函数名>
[Parameters <形式参数表>]
<语句序列>
Return [<表达式>]
说明:
①缺省[<表达式>]返回.T.。

②与过程一样,自定义函数,可以单独以同名程序文件存储,也可以存入过程文件中。

2.自定义函数的调用
小提示:过程中叫实际参数的,函数中叫自变量。

格式:[[因变量]=] <函数名>(自变量表)
说明:
函数查找规则
调用函数时,先在内部函数中找;找不到再到打开的过程文件中找;再找不到,在当前文件夹中找;再找不到,出错。

①若自定义函数与内部函数同名,将不被找到,用不到。

②参数表要与自变量表相对应,包括类型和个数。

③自变量表中,可以是变量,也可以是表达式。

自变量默认传值。

要传引用,须在自变量前面加“@”,或SET UDFPARMS TO REFERENCE设置默认为传引用。

④函数可以当过程用,调用格式为“do <函数名> with 自变量表”。

但要注意,当过程用时,默认传引用,因为过程默认传引用;且放弃返回值。

小提示:自变量默认传值,是向C语言靠拢。

小提示:过程默认传引用,函数默认传值。

第122页,例 4.41定义一个函数,将day()日期转成“公元年月日”格式。

Y=DA()
?Y
return
*-------------
Function DA
D="公元"+LTRIM(STR(YEAR(DATE())))+"年"
D=D+LTRIM(STR(MONTH(DATE())))+"月"
D=D+LTRIM(STR(DAY(DATE())))+"日"
Return D
第122页,例 4.42用自定义函数计算组合数。

)!
(!!),(n m n m n m C -=
y=c(5,3)
?y
return
*-------------------
Function FAC &&阶乘factor
parameters x
f=1
for k=1 to x
f=f*k
endfor
return f
*-------------------
Function C &&组合数conbination
parameters m,n
y=int(FAC(m)/(FAC(n)*FAC(m-n)))
return y *附加 4.5.5 自定义函数的括号参数格式
“()”在VFP 中是间接引用符,有传值之意。

1.自函数的“()式”结构
格式:
Function <函数名>([<参数表>])
<语句序列>
Return [<表达式>]
说明:这是自定义函数的另一种格式。

它只是将Function 行和Parameter 行合并成一行,其它并无差别;其调用方式也没有区别。

小提示:表单自定义函数不能用括号参数格式,故一般不学、不用。

例 自定义函数fun1(x,y,z),分别将其当过程和“()式”函数调用。

A=123
B=234
C="abc"
clear
do fun1 with A, (B),C &&当过程用,默认传引用,但B 传值
?"A=",A,"B=",B,"C=",C
D=fun1(A,@B,@C) &&当函数用,默认传值,但B 和C 传引用
?"D=",D
Return
*-------------------
Function fun1(X,Y,Z) x=x+10000
y=y+10000
z=z+"12345"
return X+Y。

相关文档
最新文档