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 en IEEE_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.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow