Fortran 简明教程
Fortran - Modules
模块就像是一个包,在您编写非常大的程序或者您的函数或子例程可用于多个程序时,可将它们保留在内。
模块为您提供一种将程序拆分成多个文件的方法。
模块用于:
-
打包子程序、数据和接口块
-
定义可供多个例程使用的全局数据。
-
声明可用于您选择的任何例程内的变量。
-
将整个模块导入到另一个程序或子例程中使用。
Syntax of a Module
一个模块包含两部分:
-
用于语句声明的规范部分
-
用于子例程和函数定义的包含部分
模块的常规形式如下:
module name
[statement declarations]
[contains [subroutine and function definitions] ]
end module [name]
Using a Module into your Program
您可以通过 use 语句在程序或子程序中合并一个模块 -
use name
请注意
-
可以根据需要添加尽可能多的模块,每个模块都将放在单独的文件中并单独编译。
-
一个模块可以用于各种不同的程序。
-
同一个程序中可以多次使用一个模块。
-
在模块说明部分声明的变量对模块是全局的。
-
在模块中声明的变量将成为使用该模块的任何程序或例程中的全局变量。
-
use 语句可以出现在主程序中,或者可以使用特定模块中声明的例程或变量的任何其他子程序或模块。
Example
以下示例演示了此概念 −
module constants
implicit none
real, parameter :: pi = 3.1415926536
real, parameter :: e = 2.7182818285
contains
subroutine show_consts()
print*, "Pi = ", pi
print*, "e = ", e
end subroutine show_consts
end module constants
program module_example
use constants
implicit none
real :: x, ePowerx, area, radius
x = 2.0
radius = 7.0
ePowerx = e ** x
area = pi * radius**2
call show_consts()
print*, "e raised to the power of 2.0 = ", ePowerx
print*, "Area of a circle with radius 7.0 = ", area
end program module_example
当您编译和执行上述程序时,它将生成以下结果 −
Pi = 3.14159274
e = 2.71828175
e raised to the power of 2.0 = 7.38905573
Area of a circle with radius 7.0 = 153.938049
Accessibility of Variables and Subroutines in a Module
默认情况下,模块中的所有变量和子程序都可供使用模块代码的程序通过 use 语句使用。
但是,您可以使用 private 和 public 属性控制模块代码的可访问性。当您将某些变量或子程序声明为私有的时,它在模块外部不可用。
Example
以下示例说明了这一概念 -
在前面的示例中,我们有两个模块变量, e 和 pi. ,让我们将它们设为私有的并观察输出 -
module constants
implicit none
real, parameter,private :: pi = 3.1415926536
real, parameter, private :: e = 2.7182818285
contains
subroutine show_consts()
print*, "Pi = ", pi
print*, "e = ", e
end subroutine show_consts
end module constants
program module_example
use constants
implicit none
real :: x, ePowerx, area, radius
x = 2.0
radius = 7.0
ePowerx = e ** x
area = pi * radius**2
call show_consts()
print*, "e raised to the power of 2.0 = ", ePowerx
print*, "Area of a circle with radius 7.0 = ", area
end program module_example
当您编译并执行上述程序时,它会给出以下错误消息 -
ePowerx = e ** x
1
Error: Symbol 'e' at (1) has no IMPLICIT type
main.f95:19.13:
area = pi * radius**2
1
Error: Symbol 'pi' at (1) has no IMPLICIT type
由于 e 和 pi, 都被声明为私有,因此程序 module_example 无法再访问这些变量。
但是,其他模块子程序可以访问它们 -
module constants
implicit none
real, parameter,private :: pi = 3.1415926536
real, parameter, private :: e = 2.7182818285
contains
subroutine show_consts()
print*, "Pi = ", pi
print*, "e = ", e
end subroutine show_consts
function ePowerx(x)result(ePx)
implicit none
real::x
real::ePx
ePx = e ** x
end function ePowerx
function areaCircle(r)result(a)
implicit none
real::r
real::a
a = pi * r**2
end function areaCircle
end module constants
program module_example
use constants
implicit none
call show_consts()
Print*, "e raised to the power of 2.0 = ", ePowerx(2.0)
print*, "Area of a circle with radius 7.0 = ", areaCircle(7.0)
end program module_example
当您编译和执行上述程序时,它将生成以下结果 −
Pi = 3.14159274
e = 2.71828175
e raised to the power of 2.0 = 7.38905573
Area of a circle with radius 7.0 = 153.938049