VFP0406变量作用域、自定义函数汇总(定稿)_全局变量默认作用域
VFP0406变量作用域、自定义函数汇总(定稿)由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“全局变量默认作用域”。
VFP-04-06变量作用域、自定义函数.doc 8-1 变量作用域、自定义函数
4.5.3 内存变量的作用域
变量的作用域:变量的作范围。程序由模块(主、子程序)组成,模块中有内存变量,内存变量有作用范围。变量的作用域,从定义变量处开始,一直向下。
1.定义全局内存变量
全局变量既可以是单个变量,也可以是数组。分别以下列格式定义。
格式1:Public 格式2:Public(上界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定义局部变量 VFP-04-06变量作用域、自定义函数.doc 8-2 格式1:Private 格式2:Private(上界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 VFP-04-06变量作用域、自定义函数.doc 8-3 ?学号 &&结果是字段变量“学号”值,如“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)有没有不通过子程序扩展作用域的变量?
VFP-04-06变量作用域、自定义函数.doc 8-4 有,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变量的情况。
⑤如何决定传值、传地址?由实际参数决定。过程的实际参数默认引用。要传值须实际参数加“()”,或者写成表达式。VFP-04-06变量作用域、自定义函数.doc 8-5
图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 自定义函数 VFP-04-06变量作用域、自定义函数.doc 8-6 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 用自定义函数计算组合数。VFP-04-06变量作用域、自定义函数.doc 8-7 m!
n!(mn)!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 C(m,n)*附加 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 *-------------------VFP-04-06变量作用域、自定义函数.doc 8-8 Function fun1(X,Y,Z)x=x+10000 y=y+10000 z=z+“12345” return X+Y