Поиск…


Синтаксис модуля

Модуль представляет собой набор объявлений типов, деклараций и процедур данных. Основной синтаксис:

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

Как и с указателями переменной, указатели на процедуры также могут быть защищены, что снова предотвращает изменение целевой ассоциации.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow