论文部分内容阅读
摘要: 结构化程序设计尽管简化程序设计过程,然而也给变量的使用带来一些问题。其中尤为突出的是同名变量的重叠,相互影响。通过隐藏变量,消除重叠影响,可以高效正确实现模块之间的相互调用。
关键词: VF;模块化;同名变量
中图分类号:TP3文献标识码:A文章编号:1671-7597(2010)0910128-01
1 提出问题
程序模块是以完成某特定功能为目的具有相对独立性的程序。一个较大的程序一般应分为若干个程序模块,每个模块用来实现一个特定的功能。
应用模块化程序设计方法,大大简化了程序设计过程,然而也给变量的使用带来了一些问题。这主要跟变量的作用范围有关。比如调用程序和被调用程序往往由不同的人编写,而他们可能使用了相同的变量名,这时就有可能出现问题。
2 同名变量在相互调用模块中的相互影响
在处理VF变量时发现了这样一个问题:对于不同函数(模块的一种)中定义的同名变量,我原来只是简单根据变量名称进行区分,由于作用范围不同,因为虽然同名但互不影响;但这样的方法用在相互调用的模块中就会出问题。因为此时同名变量会重叠,并相互影响。
例如:计算1!+3!+5!,编程如下:
s=0
fori=1to5step 2
s= s+ funjc(i)
endfor
?"s=" , s
return
functionfunjc
parameterk
s=1
for i=1 to k
s=s*i
endfor
? str(k,1)+"!=",s
return s
endfunc
程序运行结果:
1!= 1
4!= 24
s= 25
运行结果,明显错误。分析上述程序,可以发现,自定义函数funjc中用到的变量i,实际上主程序中已经建立,这时子程序的运行改变了主程序中变量的取值,造成结果错误。
其本质问题是主程序的变量的作用范围问题。每个变量都有它的作用范围,在它的定义域内有效。VF中变量的作用范围有三种:全局变量在整个程序中,包括上下级过程中都有效用,用public声名;局部变量只在定义它的模块内有效,用local声名;私有变量在定义它的模块和它的下级子程序或过程内有效,用PRIVATE命令声明,在程序中可以直接使用(没有预先声明),即在程序中没有通过PUBLIC和LOCAL命令事先声明,而直接使用的变量都是私有变量。
上例主程序模块同名变量i在它本身及下级子程序模块或过程内均有效。为了得到正确的结果应该史主程序同名变量i在子程序中无效,即同名变量i的作用范围仅在主程序模块中。
3 用PRIVATE命令隐藏主程序中可能存在的变量
为解决上述问题,可以在子程序中用PRIVATE命令隐藏主程序中可能存在的变量,使这些变量在子程序中暂时无效。有两种命令格式:
【格式1】PRIVATE<内存变量表>
【格式2】PRIVATEALL[LIKE|EXCEPT<通配符>]
在这里应该注意:
1)对PRIVATE中内存变量的修改并不影响上级程序中与之同名的内存变量的值。此命令只对本级程序及以下各级子程序有效,当返回到上级程序时,被PRIVETE隐藏的当前程序中的内存变量自动删除。
2)在它们被隐藏期间,程序就不能再调用这些被隐藏的上级内存变量,但实际上它们仍然存在,一旦含有PRIVATE内存变量的程序结束后,被PRIVATE隐藏起来的那些以前建立的同名的上级内存变量自动恢复以前的内容和状态。
现可将上述程序略加修改,便得到正确结果。修改如下:
s=0
fori=1to5step 2
s= s+ funjc(i)
endfor
?"s=" , s
return
functionfunjc
parameterk
privateI
s=1
fori=1tok
s=s*i
endfor
? str(k,1)+"!=",s
return s
endfunc
运行结果:
1!= 1
3!= 6
5! = 120
s= 127
上例,通过“隐藏”操作隐藏了子程序funjc中的和主程序同名的变量i。改变了主程序的变量i的作用范围。
4 LOCAL隐藏与PRIVATE隐藏的不同
实际上,LOCAL命令在建立局部变量的同时,也具有隐藏上层模块中
关键词: VF;模块化;同名变量
中图分类号:TP3文献标识码:A文章编号:1671-7597(2010)0910128-01
1 提出问题
程序模块是以完成某特定功能为目的具有相对独立性的程序。一个较大的程序一般应分为若干个程序模块,每个模块用来实现一个特定的功能。
应用模块化程序设计方法,大大简化了程序设计过程,然而也给变量的使用带来了一些问题。这主要跟变量的作用范围有关。比如调用程序和被调用程序往往由不同的人编写,而他们可能使用了相同的变量名,这时就有可能出现问题。
2 同名变量在相互调用模块中的相互影响
在处理VF变量时发现了这样一个问题:对于不同函数(模块的一种)中定义的同名变量,我原来只是简单根据变量名称进行区分,由于作用范围不同,因为虽然同名但互不影响;但这样的方法用在相互调用的模块中就会出问题。因为此时同名变量会重叠,并相互影响。
例如:计算1!+3!+5!,编程如下:
s=0
fori=1to5step 2
s= s+ funjc(i)
endfor
?"s=" , s
return
functionfunjc
parameterk
s=1
for i=1 to k
s=s*i
endfor
? str(k,1)+"!=",s
return s
endfunc
程序运行结果:
1!= 1
4!= 24
s= 25
运行结果,明显错误。分析上述程序,可以发现,自定义函数funjc中用到的变量i,实际上主程序中已经建立,这时子程序的运行改变了主程序中变量的取值,造成结果错误。
其本质问题是主程序的变量的作用范围问题。每个变量都有它的作用范围,在它的定义域内有效。VF中变量的作用范围有三种:全局变量在整个程序中,包括上下级过程中都有效用,用public声名;局部变量只在定义它的模块内有效,用local声名;私有变量在定义它的模块和它的下级子程序或过程内有效,用PRIVATE命令声明,在程序中可以直接使用(没有预先声明),即在程序中没有通过PUBLIC和LOCAL命令事先声明,而直接使用的变量都是私有变量。
上例主程序模块同名变量i在它本身及下级子程序模块或过程内均有效。为了得到正确的结果应该史主程序同名变量i在子程序中无效,即同名变量i的作用范围仅在主程序模块中。
3 用PRIVATE命令隐藏主程序中可能存在的变量
为解决上述问题,可以在子程序中用PRIVATE命令隐藏主程序中可能存在的变量,使这些变量在子程序中暂时无效。有两种命令格式:
【格式1】PRIVATE<内存变量表>
【格式2】PRIVATEALL[LIKE|EXCEPT<通配符>]
在这里应该注意:
1)对PRIVATE中内存变量的修改并不影响上级程序中与之同名的内存变量的值。此命令只对本级程序及以下各级子程序有效,当返回到上级程序时,被PRIVETE隐藏的当前程序中的内存变量自动删除。
2)在它们被隐藏期间,程序就不能再调用这些被隐藏的上级内存变量,但实际上它们仍然存在,一旦含有PRIVATE内存变量的程序结束后,被PRIVATE隐藏起来的那些以前建立的同名的上级内存变量自动恢复以前的内容和状态。
现可将上述程序略加修改,便得到正确结果。修改如下:
s=0
fori=1to5step 2
s= s+ funjc(i)
endfor
?"s=" , s
return
functionfunjc
parameterk
privateI
s=1
fori=1tok
s=s*i
endfor
? str(k,1)+"!=",s
return s
endfunc
运行结果:
1!= 1
3!= 6
5! = 120
s= 127
上例,通过“隐藏”操作隐藏了子程序funjc中的和主程序同名的变量i。改变了主程序的变量i的作用范围。
4 LOCAL隐藏与PRIVATE隐藏的不同
实际上,LOCAL命令在建立局部变量的同时,也具有隐藏上层模块中