サーチ…


モジュール構文

Moduleは、型宣言、データ宣言、およびプロシージャの集合です。基本的な構文は次のとおりです。

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_ExceptionsIEEE_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

varmod2でプライベートであるためmod2です。

保護されたモジュールエンティティ

モジュールエンティティにアクセス制御( 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