수색…
모듈 구문
모듈은 형식 선언, 데이터 선언 및 프로 시저의 모음입니다. 기본 구문은 다음과 같습니다.
module module_name
use other_module_being_used
! The use of implicit none here will set it for the scope of the module.
! Therefore, it is not required (although considered good practice) to repeat
! it in the contained subprograms.
implicit none
! Parameters declaration
real, parameter, public :: pi = 3.14159
! The keyword private limits access to e parameter only for this module
real, parameter, private :: e = 2.71828
! Type declaration
type my_type
integer :: my_int_var
end type
! Variable declaration
integer :: my_integer_variable
! Subroutines and functions belong to the contains section
contains
subroutine my_subroutine
!module variables are accessible
print *, my_integer_variable
end subroutine
real function my_func(x)
real, intent(in) :: x
my_func = x * x
end function my_func
end module
다른 프로그램 단위의 모듈 사용
다른 프로그램 단위 (모듈, 프로 시저 또는 프로그램)에서 모듈로 선언 된 엔티티에 액세스하려면 use
문을 사용 하여 모듈을 사용해야합니다.
module shared_data
implicit none
integer :: iarray(4) = [1, 2, 3, 4]
real :: rarray(4) = [1., 2., 3., 4.]
end module
program test
!use statements most come before implicit none
use shared_data
implicit none
print *, iarray
print *, rarray
end program
use
문은 선택한 이름 만 가져 오기를 지원합니다.
program test
!only iarray is accessible
use shared_data, only: iarray
implicit none
print *, iarray
end program
엔티티는 이름 변경 목록 을 사용하여 다른 이름으로 액세스 할 수도 있습니다.
program test
!only iarray is locally renamed to local_name, rarray is still acessible
use shared_data, local_name => iarray
implicit none
print *, local_name
print *, rarray
end program
또한 이름 바꾸기는 only
옵션과 결합 할 수 있습니다.
program test
use shared_data, only : local_name => iarray
end program
따라서 모듈 엔티티 iarray
만 액세스되지만 로컬 이름은 local_name
입니다.
비공개 로 이름 표시를 가져 오기 위해 선택하면 프로그램으로 가져올 수 없습니다.
본질적인 모듈
Fortran 2003은 고유의 상수, 파생 된 유형 및 모듈 프로 시저에 대한 액세스를 제공하는 내장 모듈을 도입했습니다. 이제 5 개의 표준 내장 모듈이 있습니다.
-
ISO_C_Binding
; C 상호 운용성 지원. -
ISO_Fortran_env
; Fortran 환경에 대해 자세히 설명합니다. -
IEEE_Exceptions
,IEEE_Arithmetic
및IEEE_Features
; 소위 IEEE 산술 시설을 지원합니다.
이러한 내장 모듈은 Fortran 라이브러리의 일부이며 use
문에서 명시 적으로 명시된 고유 한 특성을 가질 수 있다는 점을 제외하면 다른 모듈과 마찬가지로 액세스 할 수 있습니다.
use, intrinsic :: ISO_C_Binding
이렇게하면 동일한 이름의 사용자 제공 모듈을 사용할 수있는 경우 내장 모듈이 사용됩니다. 거꾸로
use, non_intrinsic :: ISO_C_Binding
내장 모듈 대신 액세스 가능한 동일한 사용자 제공 모듈에 액세스 할 수 있습니다. 에서 지정된 모듈 특성없이
use ISO_C_Binding
사용 가능한 비 내장 모듈이 내장 모듈보다 선호 될 것입니다.
내장 IEEE 모듈은 범위 지정 단위에서 액세스 가능성이 정의 된 엔티티를 참조하지 않고도 코드 동작을 변경할 수 있다는 점에서 다른 모듈과 다릅니다.
액세스 제어
모듈에서 선언 된 기호의 액세스 가능성은 private
및 public
속성 및 명령문을 사용하여 제어 할 수 있습니다.
명령문 양식의 구문 :
!all symbols declared in the module are private by default
private
!all symbols declared in the module are public by default
public
!symbols in the list will be private
private :: name1, name2
!symbols in the list will be public
public :: name3, name4
속성 양식의 구문 :
integer, parameter, public :: maxn = 1000
real, parameter, private :: local_constant = 42.24
공개 기호는 모듈을 사용하여 프로그램 단위에서 액세스 할 수 있지만 개인 기호로는 액세스 할 수 없습니다.
사양을 사용하지 않으면 기본값은 public
입니다.
다음을 사용하는 기본 액세스 사양
private
또는
public
entity-declaration-list 와 다른 액세스를 지정하여 변경할 수 있습니다.
public :: name1, name2
또는 속성을 사용합니다.
이 액세스 제어는 다른 모듈에서 가져온 기호에도 영향을줍니다.
module mod1
integer :: var1
end module
module mod2
use mod1, only: var1
public
end module
program test
use mod2, only: var1
end program
가능하지만
module mod1
integer :: var1
end module
module mod2
use mod1, only: var1
public
private :: var1
end module
program test
use mod2, only: var1
end program
mod2
에서 var
이 private이기 때문에 불가능합니다.
보호 된 모듈 엔터티
모듈 엔티티가 액세스 제어 ( public
또는 private
)를 가질 수있을뿐만 아니라 모듈 엔티티도 protect
속성을 가질 수 있습니다. 공개적으로 보호 된 개체는 사용과 연관 될 수 있지만 사용 된 개체는 사용상의 제한을받습니다.
module mod
integer, public, protected :: i=1
end module
program test
use mod, only : i
print *, i ! We are allowed to get the value of i
i = 2 ! But we can't change the value
end program test
공개 된 보호 대상은 모듈 외부를 가리킬 수 없습니다
module mod
integer, public, target, protected :: i
end module mod
program test
use mod, only : i
integer, pointer :: j
j => i ! Not allowed, even though we aren't changing the value of i
end program test
모듈의 공용 보호 포인터의 경우 제한 사항이 다릅니다. 보호되는 것은 포인터의 연결 상태입니다.
module mod
integer, public, target :: j
integer, public, protected, pointer :: i => j
end module mod
program test
use mod, only : i
i = 2 ! We may change the value of the target, just not the association status
end program test
변수 포인터와 마찬가지로 프로 시저 포인터도 보호되어 타겟 연결 변경을 방지 할 수 있습니다.