Fortran - 模块

  • 简述

    一个模块就像一个包,你可以在其中保存你的函数和子例程,以防你正在编写一个非常大的程序,或者你的函数或子例程可以在多个程序中使用。
    模块为您提供了一种在多个文件之间拆分程序的方法。
    模块用于 -
    • 封装子程序、数据和接口块。
    • 定义可由多个例程使用的全局数据。
    • 声明可以在您选择的任何例程中可用的变量。
    • 将一个模块完全导入另一个程序或子程序以供使用。
  • 模块的语法

    一个模块由两部分组成 -
    • 声明声明的规范部分
    • a 包含子程序和函数定义的部分
    模块的一般形式是 -
    
    module name     
       [statement declarations]  
       [contains [subroutine and function definitions] ] 
    end module [name]
    
  • 在程序中使用模块

    您可以通过 use 语句将模块合并到程序或子例程中 -
    
    use name  
    
    请注意
    • 您可以根据需要添加任意数量的模块,每个模块将位于单独的文件中并单独编译。
    • 一个模块可以用于各种不同的程序。
    • 一个模块可以在同一个程序中多次使用。
    • 在模块规范部分中声明的变量对模块来说是全局的。
    • 在模块中声明的变量在使用该模块的任何程序或例程中都成为全局变量。
    • use 语句可以出现在主程序中,也可以出现在使用特定模块中声明的例程或变量的任何其他子例程或模块中。

    例子

    以下示例演示了该概念 -
    
    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陈述。
    但是,您可以使用privatepublic属性。当您将某些变量或子例程声明为私有时,它在模块外不可用。

    例子

    以下示例说明了这个概念 -
    在前面的例子中,我们有两个模块变量,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