수색…


모듈 구문

모듈은 형식 선언, 데이터 선언 및 프로 시저의 모음입니다. 기본 구문은 다음과 같습니다.

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_ArithmeticIEEE_Features ; 소위 IEEE 산술 시설을 지원합니다.

이러한 내장 모듈은 Fortran 라이브러리의 일부이며 use 문에서 명시 적으로 명시된 고유 한 특성을 가질 수 있다는 점을 제외하면 다른 모듈과 마찬가지로 액세스 할 수 있습니다.

use, intrinsic :: ISO_C_Binding

이렇게하면 동일한 이름의 사용자 제공 모듈을 사용할 수있는 경우 내장 모듈이 사용됩니다. 거꾸로

use, non_intrinsic :: ISO_C_Binding

내장 모듈 대신 액세스 가능한 동일한 사용자 제공 모듈에 액세스 할 수 있습니다. 에서 지정된 모듈 특성없이

use ISO_C_Binding

사용 가능한 비 내장 모듈이 내장 모듈보다 선호 될 것입니다.


내장 IEEE 모듈은 범위 지정 단위에서 액세스 가능성이 정의 된 엔티티를 참조하지 않고도 코드 동작을 변경할 수 있다는 점에서 다른 모듈과 다릅니다.

액세스 제어

모듈에서 선언 된 기호의 액세스 가능성은 privatepublic 속성 및 명령문을 사용하여 제어 할 수 있습니다.

명령문 양식의 구문 :

!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

변수 포인터와 마찬가지로 프로 시저 포인터도 보호되어 타겟 연결 변경을 방지 할 수 있습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow