Fortran
モジュールの使用法
サーチ…
モジュール構文
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_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
var
はmod2
でプライベートであるため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
可変ポインタの場合と同様に、プロシージャポインタも保護され、ターゲットの関連付けの変更が防止されます。