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



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow