Szukaj…


Składnia modułu

Moduł to zbiór deklaracji typu, deklaracji danych i procedur. Podstawowa składnia to:

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

Korzystanie z modułów z innych jednostek programu

Aby uzyskać dostęp do encji zadeklarowanych w module z innej jednostki programu (moduł, procedura lub program), moduł musi być używany z instrukcją 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

Instrukcja use obsługuje import tylko wybranych nazw

program test

  !only iarray is accessible
  use shared_data, only: iarray

  implicit none

  print *, iarray
  
end program

Dostęp do encji można również uzyskać pod inną nazwą, używając listy zmian nazw:

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

Ponadto zmiana nazwy może być łączona z only opcją

program test
  use shared_data, only : local_name => iarray
end program

tak, aby uzyskać dostęp tylko do jednostki iarray jednostki, ale ma ona lokalną nazwę local_name .

Jeśli wybrano opcję importowania nazw, oznacz jako prywatne , nie możesz zaimportować ich do swojego programu.

Moduły wewnętrzne

Fortran 2003 wprowadził wewnętrzne moduły, które zapewniają dostęp do specjalnych nazwanych stałych, typów pochodnych i procedur modułowych. Istnieje teraz pięć standardowych modułów wewnętrznych:

  • ISO_C_Binding ; wspieranie interoperacyjności C;
  • ISO_Fortran_env ; opisywanie środowiska Fortran;
  • IEEE_Exceptions , IEEE_Arithmetic i IEEE_Features ; obsługa tak zwanego obiektu arytmetycznego IEEE.

Te wewnętrzne moduły są częścią biblioteki Fortran i są dostępne podobnie jak inne moduły, z wyjątkiem tego, że instrukcja use może mieć wyraźnie określony charakter wewnętrzny:

use, intrinsic :: ISO_C_Binding

Dzięki temu moduł wewnętrzny jest używany, gdy dostępny jest moduł o tej samej nazwie dostarczony przez użytkownika. Odwrotnie

use, non_intrinsic :: ISO_C_Binding

zapewnia dostęp do tego samego modułu dostarczonego przez użytkownika (który musi być dostępny) zamiast modułu wewnętrznego. Bez charakteru modułu określonego jak w

use ISO_C_Binding

dostępny nieiskrobezpieczny moduł będzie preferowany nad wewnętrznym modułem.


Wewnętrzne moduły IEEE różnią się od innych modułów tym, że ich dostępność w jednostce zakresu może zmienić zachowanie kodu nawet bez odniesienia do któregokolwiek z zdefiniowanych w nich podmiotów.

Kontrola dostępu

Dostępność symboli zadeklarowanych w module można kontrolować za pomocą private i public atrybutów i instrukcji.

Składnia formularza oświadczenia:

!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

Składnia formularza atrybutu:

integer, parameter, public :: maxn = 1000

real, parameter, private :: local_constant = 42.24

Dostęp do symboli publicznych można uzyskać z jednostek programu za pomocą modułu, ale symboli prywatnych nie można.

Jeśli nie użyto specyfikacji, wartością domyślną jest public .

Domyślna specyfikacja dostępu przy użyciu

private

lub

public

można zmienić, określając inny dostęp za pomocą listy deklaracji encji

public :: name1, name2

lub używając atrybutów.

Ta kontrola dostępu wpływa również na symbole importowane z innego modułu:

module mod1
  integer :: var1
end module

module mod2
  use mod1, only: var1

  public
end module

program test
  use mod2, only: var1
end program

jest możliwe, ale

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

nie jest możliwe, ponieważ var jest prywatny w mod2 .

Chronione elementy modułu

Oprócz umożliwienia jednostkom modułowym kontroli dostępu ( public lub private ) moduły mogą również mieć atrybut protect . Podmiot chroniony publicznie może być powiązany z użytkowaniem, ale używany podmiot podlega ograniczeniom w zakresie jego wykorzystania.

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

Chroniony cel publiczny nie może być wskazywany poza jego modułem

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

W przypadku wskaźnika chronionego publicznie w module ograniczenia są różne. Chroniony jest status asocjacji wskaźnika

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

Podobnie jak w przypadku wskaźników zmiennych, wskaźniki procedur mogą być również chronione, ponownie zapobiegając zmianie powiązania celu.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow