Fortran
Verwendung von Modulen
Suche…
Modulsyntax
Das Modul ist eine Sammlung von Typdeklarationen, Datendeklarationen und Prozeduren. Die grundlegende Syntax lautet:
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
Verwendung von Modulen anderer Programmeinheiten
Um Einheiten in einem Modul aus einer anderen Programm Einheit (Modul, Verfahren oder Programm) erklärten zuzugreifen, muss das Modul mit der verwendet wird use
Aussage.
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
Die use
Anweisung unterstützt den Import nur ausgewählter Namen
program test
!only iarray is accessible
use shared_data, only: iarray
implicit none
print *, iarray
end program
Auf Entitäten kann auch unter einem anderen Namen mit einer Umbenennungsliste zugegriffen werden:
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
Das Umbenennen kann außerdem mit der only
Option kombiniert werden
program test
use shared_data, only : local_name => iarray
end program
so dass nur die Moduleinheit iarray
zugegriffen wird , aber es hat den lokalen Namen local_name
.
Wenn Sie die Option zum Importieren von Namen als privat markieren, können Sie sie nicht in Ihr Programm importieren.
Intrinsische Module
Fortran 2003 führte intrinsische Module ein, die Zugriff auf spezielle benannte Konstanten, abgeleitete Typen und Modulprozeduren bieten. Es gibt jetzt fünf intrinsische Standardmodule:
-
ISO_C_Binding
; Unterstützung der C-Interoperabilität; -
ISO_Fortran_env
; Detaillierung der Fortran-Umgebung; -
IEEE_Exceptions
,IEEE_Arithmetic
undIEEE_Features
; Unterstützung der sogenannten IEEE-Recheneinrichtung.
Diese intrinsischen Module sind Teil der Fortran-Bibliothek und können wie andere Module aufgerufen werden, mit der Ausnahme, dass die use
Anweisung den intrinsischen Charakter hat, der explizit angegeben ist:
use, intrinsic :: ISO_C_Binding
Dadurch wird sichergestellt, dass das intrinsische Modul verwendet wird, wenn ein vom Benutzer bereitgestelltes Modul mit demselben Namen verfügbar ist. Umgekehrt
use, non_intrinsic :: ISO_C_Binding
stellt sicher, dass auf dasselbe vom Benutzer bereitgestellte Modul (auf das zugegriffen werden muss) anstelle des intrinsischen Moduls zugegriffen wird. Ohne die als in
use ISO_C_Binding
ein verfügbares nicht intrinsisches Modul wird dem intrinsischen Modul vorgezogen.
Die intrinsischen IEEE-Module unterscheiden sich von anderen Modulen darin, dass ihre Erreichbarkeit in einer Bereichseinheit das Verhalten von Code dort ändern kann, auch ohne Bezug auf die darin definierten Entitäten.
Zugangskontrolle
Die Erreichbarkeit von Symbolen, die in einem Modul deklariert sind, kann mit private
und public
Attributen und Anweisungen gesteuert werden.
Syntax des Anweisungsformulars:
!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
Syntax des Attributformulars:
integer, parameter, public :: maxn = 1000
real, parameter, private :: local_constant = 42.24
Auf öffentliche Symbole kann mit dem Modul von Programmeinheiten aus zugegriffen werden, auf private Symbole jedoch nicht.
Wenn keine Spezifikation verwendet wird, ist der Standard public
.
Die Standardzugriffsspezifikation mit
private
oder
public
kann geändert werden, indem ein anderer Zugriff mit Entitätsdeklarationsliste angegeben wird
public :: name1, name2
oder mit Attributen.
Diese Zugriffssteuerung wirkt sich auch auf Symbole aus einem anderen Modul aus:
module mod1
integer :: var1
end module
module mod2
use mod1, only: var1
public
end module
program test
use mod2, only: var1
end program
ist möglich, aber
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
ist nicht möglich, weil var
in mod2
.
Geschützte Modulentitäten
Modulentitäten können nicht nur Zugriffskontrolle ( public
oder private
) haben, sie können auch das Attribut protect
haben. Eine öffentlich geschützte Entität kann mit der Nutzung verbunden sein, die verwendete Entität unterliegt jedoch Einschränkungen bei ihrer Verwendung.
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
Ein öffentliches geschütztes Ziel darf nicht außerhalb seines Moduls gezeigt werden
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
Für einen öffentlichen geschützten Zeiger in einem Modul gelten andere Einschränkungen. Was geschützt ist, ist der Assoziationsstatus des Zeigers
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
Wie bei variablen Zeigern können auch Prozedurzeiger geschützt werden, was wiederum eine Änderung der Zielzuordnung verhindert.