Fortran 模块

模块就像一个包,你可以在其中保存你的函数和子程序,以防你正在编写一个非常大的程序,或者你的函数或子程序可以在多个程序中使用。

模块为您提供了一种在多个文件之间拆分程序的方法。

模块用于:

  • 打包子程序、数据和接口块。
  • 定义可由多个程序使用的全局数据。
  • 声明可以在您选择的任何程序中可用的变量。
  • 将一个模块完全导入到另一个程序或子程序中以供使用。
模块的语法

模块由两部分组成:

  • 语句声明的规范部分
  • 包含子程序和函数定义部分

模块的一般形式是:

  1. module name
  2. [statement declarations]
  3. [contains [subroutine and function definitions] ]
  4. end module [name]

在程序中使用模块

您可以通过 use 语句将模块合并到程序或子程序中:

  1. use name

请注意

  • 您可以根据需要添加任意多的模块,每个模块都将位于单独的文件中并单独编译。
  • 一个模块可以在各种不同的程序中使用。
  • 一个模块可以在同一个程序中多次使用。
  • 模块规范部分中声明的变量是模块的全局变量。
  • 在模块中声明的变量成为使用该模块的任何程序或程序中的全局变量。
  • use 语句可以出现在主程序中,也可以出现在使用特定模块中声明的程序或变量的任何其他子程序或模块中。
实例
  1. module constants
  2. implicit none
  3. real, parameter :: pi = 3.1415926536
  4. real, parameter :: e = 2.7182818285
  5. contains
  6. subroutine show_consts()
  7. print*, "Pi = ", pi
  8. print*, "e = ", e
  9. end subroutine show_consts
  10. end module constants
  11. program module_example
  12. use constants
  13. implicit none
  14. real :: x, ePowerx, area, radius
  15. x = 2.0
  16. radius = 7.0
  17. ePowerx = e ** x
  18. area = pi * radius**2
  19. call show_consts()
  20. print*, "e raised to the power of 2.0 = ", ePowerx
  21. print*, "Area of a circle with radius 7.0 = ", area
  22. end program module_example

结果为:

  1. Pi = 3.14159274
  2. e = 2.71828175
  3. e raised to the power of 2.0 = 7.38905573
  4. Area of a circle with radius 7.0 = 153.938049

模块中变量和子程序的可访问性

默认情况下,模块中的所有变量和子程序都可以通过 use 语句供使用模块代码的程序使用。

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

实例

以下实例可以演示:

在前面的例子中,我们有两个模块变量,epi。让我们将其设为私有并观察输出:

  1. module constants
  2. implicit none
  3. real, parameter,private :: pi = 3.1415926536
  4. real, parameter, private :: e = 2.7182818285
  5. contains
  6. subroutine show_consts()
  7. print*, "Pi = ", pi
  8. print*, "e = ", e
  9. end subroutine show_consts
  10. end module constants
  11. program module_example
  12. use constants
  13. implicit none
  14. real :: x, ePowerx, area, radius
  15. x = 2.0
  16. radius = 7.0
  17. ePowerx = e ** x
  18. area = pi * radius**2
  19. call show_consts()
  20. print*, "e raised to the power of 2.0 = ", ePowerx
  21. print*, "Area of a circle with radius 7.0 = ", area
  22. end program module_example

当您编译并执行上述程序时,它会给出以下错误消息:

  1. ePowerx = e ** x
  2. 1
  3. Error: Symbol 'e' at (1) has no IMPLICIT type
  4. main.f95:19.13:
  5. area = pi * radius**2
  6. 1
  7. Error: Symbol 'pi' at (1) has no IMPLICIT type

由于 epi 都被声明为私有,程序 module_example 无法再访问这些变量。

但是,其他模块子程序可以访问它们:

  1. module constants
  2. implicit none
  3. real, parameter,private :: pi = 3.1415926536
  4. real, parameter, private :: e = 2.7182818285
  5. contains
  6. subroutine show_consts()
  7. print*, "Pi = ", pi
  8. print*, "e = ", e
  9. end subroutine show_consts
  10. function ePowerx(x)result(ePx)
  11. implicit none
  12. real::x
  13. real::ePx
  14. ePx = e ** x
  15. end function ePowerx
  16. function areaCircle(r)result(a)
  17. implicit none
  18. real::r
  19. real::a
  20. a = pi * r**2
  21. end function areaCircle
  22. end module constants
  23. program module_example
  24. use constants
  25. implicit none
  26. call show_consts()
  27. Print*, "e raised to the power of 2.0 = ", ePowerx(2.0)
  28. print*, "Area of a circle with radius 7.0 = ", areaCircle(7.0)
  29. end program module_example

结果如下:

  1. Pi = 3.14159274
  2. e = 2.71828175
  3. e raised to the power of 2.0 = 7.38905573
  4. Area of a circle with radius 7.0 = 153.938049

分类导航