Fortran
Использование модулей
Поиск…
Синтаксис модуля
Модуль представляет собой набор объявлений типов, деклараций и процедур данных. Основной синтаксис:
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 представил встроенные модули, которые предоставляют доступ к специальным именованным константам, производным типам и процедурам модулей. В настоящее время существует пять стандартных встроенных модулей:
-
ISO_C_Binding
; поддержка совместимости С; -
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
может быть изменено путем указания другого доступа с помощью объекта-объявления-списка
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
.
Защищенные объекты модуля
Помимо того, что модули модуля имеют доступ к управлению доступом (как 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
Как и с указателями переменной, указатели на процедуры также могут быть защищены, что снова предотвращает изменение целевой ассоциации.