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, 둘 다 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