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