Fortran 简明教程

Fortran - Modules

模块就像是一个包,在您编写非常大的程序或者您的函数或子例程可用于多个程序时,可将它们保留在内。

模块为您提供一种将程序拆分成多个文件的方法。

模块用于:

  1. 打包子程序、数据和接口块

  2. 定义可供多个例程使用的全局数据。

  3. 声明可用于您选择的任何例程内的变量。

  4. 将整个模块导入到另一个程序或子例程中使用。

Syntax of a Module

一个模块包含两部分:

  1. 用于语句声明的规范部分

  2. 用于子例程和函数定义的包含部分

模块的常规形式如下:

module name
   [statement declarations]
   [contains [subroutine and function definitions] ]
end module [name]

Using a Module into your Program

您可以通过 use 语句在程序或子程序中合并一个模块 -

use name

请注意

  1. 可以根据需要添加尽可能多的模块,每个模块都将放在单独的文件中并单独编译。

  2. 一个模块可以用于各种不同的程序。

  3. 同一个程序中可以多次使用一个模块。

  4. 在模块说明部分声明的变量对模块是全局的。

  5. 在模块中声明的变量将成为使用该模块的任何程序或例程中的全局变量。

  6. 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 语句使用。

但是,您可以使用 privatepublic 属性控制模块代码的可访问性。当您将某些变量或子程序声明为私有的时,它在模块外部不可用。

Example

以下示例说明了这一概念 -

在前面的示例中,我们有两个模块变量, epi. ,让我们将它们设为私有的并观察输出 -

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

由于 epi, 都被声明为私有,因此程序 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