Fortran
Gebruik van modules
Zoeken…
Module syntaxis
Module is een verzameling typeaangiften, gegevensaangiften en procedures. De basissyntaxis is:
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
Modules van andere programma-eenheden gebruiken
Om toegang te krijgen tot entiteiten die in een module zijn aangegeven vanuit een andere programma-eenheid (module, procedure of programma), moet de module worden gebruikt met de 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
De instructie use
ondersteunt het importeren van alleen geselecteerde namen
program test
!only iarray is accessible
use shared_data, only: iarray
implicit none
print *, iarray
end program
Entiteiten kunnen ook worden geopend onder een andere naam met behulp van een naamlijst :
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
Verder kan hernoemen worden gecombineerd met de only
optie
program test
use shared_data, only : local_name => iarray
end program
zodat alleen iarray
wordt verkregen tot de module-entiteit iarray
, maar deze heeft de lokale naam local_name
.
Indien geselecteerd voor het importeren van namen die als privé zijn gemarkeerd, kunt u deze niet in uw programma importeren.
Intrinsieke modules
Fortran 2003 introduceerde intrinsieke modules die toegang bieden tot speciale benoemde constanten, afgeleide types en moduleprocedures. Er zijn nu vijf standaard intrinsieke modules:
-
ISO_C_Binding
; ondersteuning van C-interoperabiliteit; -
ISO_Fortran_env
; detaillering van de Fortran-omgeving; -
IEEE_Exceptions
,IEEE_Arithmetic
enIEEE_Features
; ondersteuning van de zogenaamde IEEE rekenfaciliteit.
Deze intrinsieke modules maken deel uit van de Fortran-bibliotheek en zijn toegankelijk zoals andere modules, behalve dat de use
de intrinsieke aard kan hebben die expliciet wordt vermeld:
use, intrinsic :: ISO_C_Binding
Dit zorgt ervoor dat de intrinsieke module wordt gebruikt wanneer een door de gebruiker verstrekte module met dezelfde naam beschikbaar is. Omgekeerd
use, non_intrinsic :: ISO_C_Binding
zorgt ervoor dat toegang wordt verkregen tot dezelfde door de gebruiker geleverde module (die toegankelijk moet zijn) in plaats van de intrinsieke module. Zonder de moduleaard zoals gespecificeerd in
use ISO_C_Binding
een beschikbare niet-intrinsieke module heeft de voorkeur boven de intrinsieke module.
De intrinsieke IEEE-modules verschillen van andere modules in die zin dat hun toegankelijkheid in een scope-eenheid het gedrag van code daar kan veranderen, zelfs zonder verwijzing naar een van de entiteiten die erin zijn gedefinieerd.
Toegangscontrole
De toegankelijkheid van symbolen die in een module zijn gedeclareerd, kan worden beheerd met behulp van private
en public
attributen en verklaringen.
Syntaxis van het afschriftformulier:
!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
Syntaxis van het attribuutformulier:
integer, parameter, public :: maxn = 1000
real, parameter, private :: local_constant = 42.24
Openbare symbolen zijn toegankelijk vanuit programma-eenheden met behulp van de module, maar privésymbolen niet.
Als er geen specificatie wordt gebruikt, is de standaard public
.
De standaard toegangsspecificatie met
private
of
public
kan worden gewijzigd door een andere toegang op te geven met entiteit-aangiftelijst
public :: name1, name2
of gebruik attributen.
Dit toegangsbeheer heeft ook invloed op symbolen die zijn geïmporteerd uit een andere module:
module mod1
integer :: var1
end module
module mod2
use mod1, only: var1
public
end module
program test
use mod2, only: var1
end program
is mogelijk, maar
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
is niet mogelijk omdat var
privé is in mod2
.
Beschermde module-entiteiten
Naast het toestaan van module-entiteiten om toegangscontrole te hebben ( public
of private
), kunnen modules-entiteiten ook het protect
hebben. Een openbaar beschermde entiteit kan gebruikgerelateerd zijn, maar de gebruikte entiteit is onderworpen aan beperkingen op het gebruik ervan.
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
Een publiek beschermd doel mag niet buiten zijn module worden aangewezen
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
Voor een openbare beveiligde aanwijzer in een module zijn de beperkingen anders. Wat beschermd is, is de associatiestatus van de aanwijzer
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
Net als bij variabele aanwijzers, kunnen procedure-aanwijzers ook worden beschermd, waardoor opnieuw verandering van doelassociatie wordt voorkomen.