Fortran
Wykorzystanie modułów
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
iIEEE_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.