next up previous contents
Nächste Seite: MODULE Aufwärts: Unterprogramme Vorherige Seite: Rekursive Unterprogramme   Inhalt

INTERFACE-Blöcke

Wenn man ein Unterprogramm aufruft, das über den FORTRAN 77 Standard hinausgeht, braucht man eine Schnittstelle im aufrufenden Programm, in der der Unterprogrammkopf und die Deklaration der Formalparameter aufgeführt werden.
Das Unterprogramm braucht ein explizites Interface, wenn es

Syntax:

 INTERFACE [gattung]
  [[...] FUNCTION func_name [....]
   deklarationsteil
  END [FUNCTION [func_name]]]
  [[...] SUBROUTINE sub_name [....]
   deklarationsteil
  END [SUBROUTINE [sub_name]]]
  [MODULE PROCEDURE modul_up_name [modul_up_name]]
 END INTERFACE

Gattungsnamen oder generische Namen fassen mehrere Unterprogramme zusammen, wobei es dann von den Aktualparametern abhängt, welches aufgerufen wird:

INTERFACE swap
 SUBROUTINE iswap (a,b)
  INTEGER :: a,b
 END SUBROUTINE
 SUBROUTINE swap (a,b)
  REAL :: a,b
 END SUBROUTINE swap
 SUBROUTINE dswap (a,b)
  DOUBLE PRECISION :: a,b
 END
END INTERFACE

Benutzerdefinierte Operatoren sind Operatoren im üblichen Sinn und können vordefinierte Operatoren auch überladen:

INTERFACE OPERATOR (+)
 FUNCTION addstring (a,b)
  IMPLICIT NONE
  CHARACTER (LEN=LEN(TRIM(ADJUSTL(a)))+LEN(TRIM(ADJUSTL(b)))) :: addstring
  CHARACTER (LEN=*), INTENT(IN) :: a, b
 END FUNCTION
END INTERFACE
wobei die Funktion addstring z.B. wie folgt aussehen könnte:
CHARACTER FUNCTION addstring (a,b)
 IMPLICIT NONE
 CHARACTER (LEN=LEN(TRIM(ADJUSTL(a)))+LEN(TRIM(ADJUSTL(b)))) :: addstring
 CHARACTER (LEN=*), INTENT(IN) :: a, b
 addstring = TRIM(ADJUSTL(a))//TRIM(ADJUSTL(b))
END FUNCTION

Benutzerdefinierte Wertzuweisungen überladen die vordefinierte Wertzuweisung (=) mit einer benutzerdefinierten Funktion:

INTERFACE ASSIGNMENT (=)
 SUBROUTINE my_len_trim (lang, a)
  IMPLICIT NONE
  INTEGER, INTENT(OUT) :: lang
  CHARACTER (LEN=*), INTENT(IN) :: a
 END
END INTERFACE
und ein azupassendes Unterprogramm könnte folgendermaßen aussehen:
SUBROUTINE my_len_trim (lang, a)
 IMPLICIT NONE
 INTEGER, INTENT(OUT) :: lang
 CHARACTER (LEN=*), INTENT(IN) :: a
 lang = LEN_TRIM(ADJUSTL(a))
END SUBROUTINE
Der Aufruf dieser SUBROUTINE erfolgt durch
 ...
 CHARACTER*80 :: text
 INTEGER :: laenge
 ...
 laenge = text
 ...


next up previous contents
Nächste Seite: MODULE Aufwärts: Unterprogramme Vorherige Seite: Rekursive Unterprogramme   Inhalt
Reinfried O. Peter 2001-09-07