参考:彭国伦:《Fortan 95程序设计》,2002年。第8章,第11章
结构
- Module中的变量
- Module中的自定义类型
- Module中的函数
- Public, Private
- Use
使用场景:Module可以用来封装程序模块,通常用来把程序中,具备相关功能的函数及变量封装在一起(在Fortran 90中新加入的)
基本语法:
module module_name
implicit none
! declaration of variables
... ...
end module [module_name]
1. Module中的变量
按之前的介绍,全局变量用COMMON实现。详见:http://t.csdn.cn/AsrUe
通过Module也可实现全局变量,
方法一:使用COMMON
方法二:在Module中定义的变量通过SAVE属性修饰
module global
implicit none
! 全局变量的方式1:commmon修饰
integer :: global_a
common global_a
! 全局变量的方式2:save属性
integer,save :: global_b
! ?全局变量(使用ivf编译器),其他编译器可能为局部变量
integer :: global_c
end module global
program module_variable
use global
implicit none
! Variables
! Body of Program
! global_x are variable in module global
write(*, *) global_a, global_b, global_c
call module_f()
write(*, *) global_a, global_b, global_c
stop
end program module_variable
subroutine module_f()
use global
implicit none
global_a = 111
global_b = 222
global_c = 333
end subroutine module_f
输出结果为:
0 0 0
111 222 333
尽管不同的编译器对于没有save修饰的module中的变量是否为全局变量处理方式可能不尽相同,但是,这里提醒我们要注意module中的变量生存周期。
上例还包含了使用Module的若干规则:
- 需要使用这些变量的函数时(在program或这某个module中)只要USE这个Module即可;
- Module的代码需要需要编写在USE Module之前。
2. Module中的自定义类型
若试图在不同的函数中使用自定义类型(TYPE),应当试图让这些函数“明白”该自定义类型。一个常用的方法是将自定义类型封装在某个Module中,在需要使用的地方USE这个Module。
示例:
module module_pupil
implicit none
type :: pupil
integer :: age
real :: height
character :: gender
end type
end module module_pupil
program module_type
use module_pupil
implicit none
type(pupil) :: pup_one
pup_one = pupil(8, 130.0, 'B')
call show_pup( pup_one )
end program module_type
subroutine show_pup(pup)
! 使用module_pupil,让函数知道type(pupil)
use module_pupil
implicit none
type(pupil) :: pup
write(*, *) pup
end subroutine
输出结果为:
8 130.0000 B
3. Module中的函数
语法:
在关键词contains之后添加函数
module module_name
... ...
! 声明相关变量,自定义类型
... ...
contains
subroutine sub_name
... ...
... ...
end subroutine sub_name
function func_name
... ...
... ...
end function func_name
end module
同一个Module中,函数可以直接使用所声明的变量(注意,变量声明在前,contains之后才是函数的定义;module中不允许对变量进行赋值的操作!!!)
Visual Fortran提供一些扩充函数库就用这个方法来归类:
数值函数库,IMSL,存放在module IMSL中;
3D绘图库,OpenGL,存放在module OpenGL中。
使用前须 use IMSL, use OpenGL
4. Public, Private
Module里面的变量和函数,可以通过Public或Private来区分成公开或私有。
公开,就是任何Use这个Module的地方都可访问(默认的)。
私有,就是相关变量和函数仅限于该Module内部使用。
一些使用问题放在重载,继承的部分介绍。。。
5. Use
编写好Module之后,要使用Use命令才能让Module外的函数使用Module里面的东西。
为了避免变量或函数名称重复,Use命令后面,可以临时把Module里面的变量或函数名称改名。
语法:
module mod_a
implicit none
integer va
contains
function fa(...)
...
end function
end module mod_a
program rename
use mod_a, aa=>va, ba=>fa
implicit none
...
end program rename
如果不需要使用Module中的所有公开的变量、函数,可以通过Only命令来选择只使用部分。这样可以避免重名的问题。
语法:
module mod_a
implicit none
integer va
contains
function fa(...)
...
end function
end module mod_a
program rename
use mod_a, only: fa
! only后也可重命名
! use mod_a, only: ba=>fa
implicit none
...
end program rename