Fortran模塊

模塊就像一個包,可以包含函數和子程序,如果正在編寫一個非常大的項目,或者函數或子程序需要在多個程序中使用。

模塊提供拆分多個文件之間程序的方式。

模塊用於:

  • 包裝子程序,數據和接口塊。
  • 定義,可以使用多於一個常規全局數據。
  • 聲明可以選擇的任何程序內提供的變量。
  • 導入整個模塊,可使用在另一個程序或子程序。

模塊的語法

模塊由兩部分組成:

  • 規範的一部分,語句聲明
  • 包含一部分用於子程序和函數定義

模塊的一般形式是:

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

使用一個模塊到程序中

可以將一個程序或子程序通過使用聲明的模塊:

use name

請注意

  • 可以根據需要添加儘可能多的模塊,在不同的文件中,並單獨編譯。

  • 一個模塊可以在各種不同的程序中使用。

  • 一個模塊在同一程序中可使用多次。

  • 在模塊規格說明部分內聲明的變量,在模塊是全局的。

  • 在一個模塊中聲明的變量成爲在模塊中使用的任何程序或例程的全局變量。

  • 使用聲明可以出現在主程序中,或任何其他子程序或模塊,它使用所述例程或在一個特定的模塊聲明的變量。

示例

下面的例子演示了這一概念:

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

在一個模塊變量和子程序的訪問

缺省情況下,在一個模塊中的所有的變量和子程序被提供給正在使用的模塊代碼,通過 use 語句聲明。

但是,可以控制模塊代碼中使用的private 和 public 屬性的訪問性。當聲明一些變量或子程序爲私有,這是不可以用在模塊之外使用。

示例

下面的例子說明了這個概念:

在前面的例子中,有兩個模塊變量,e和PI。把它們設置爲private並觀察輸出:

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兩者都聲明爲private,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