2012-12-05 10 views
12

In Fortran 90 können wir Funktionen mit einer Schnittstelle überladen. Nach this site können wir diese Funktionen jedoch nicht mit demselben Argumentnamen definieren. Mit gfortran scheint es kein Problem zu sein, wie der folgende Code funktioniert gut genug:Überladen von Funktionen mit Fortran

interface check 
    module procedure check_int, check_real 
end interface 

contains 

subroutine check_int(cur, dname, func_name, fname) 
    integer, allocatable, intent(in) :: cur(:) 
    character(*) :: dname, func_name, fname 
    ... 
end subroutine 

subroutine check_real(cur, dname, func_name, fname) 
    real, allocatable, intent(in) :: cur(:) 
    character(*) :: dname, func_name, fname 
    ... 
end subroutine 

So ist es schlechte Praxis, dies zu tun?

Bearbeiten: Aufruf der Funktion mit Schlüsselwörtern ändert nichts.

Antwort

13

Ihr Beispiel ist absolut gültig. Sie können durch den TYPE der Argumente unterschieden werden. Die Namen sind dann nicht wichtig. In Ihrem Fall unterscheidet sich der Typ des cur Arguments.

Die Argumente mit dem gleichen Namen können nach Typ, Art oder Rang unterschieden werden (TKR-Kompatibilität).

Der Punkt des referenzierten Artikels ist, dass Sie zwei bestimmte Prozeduren nur durch die Reihenfolge der Argumente nicht unterscheiden können. Dies liegt daran, dass die Prozeduren mit den Schlüsselwortargumenten in beliebiger Reihenfolge aufgerufen werden können. Dies kann durch Verwendung anderer Namen für die Argumente aufgehoben werden.

Ansonsten ist die Deklaration spezifischerer Prozeduren für einen generischen mit denselben Namen von Argumenten, aber mit unterschiedlichen Typen/Arten/Rängen sehr üblich und absolut gültig.

Fortran 2003/2008 fügt der generischen Auflösung einige weitere Möglichkeiten hinzu. Es ist auch möglich, Prozeduren durch das Zeiger-/Zuordnungsattribut ihrer Argumente und durch die Prozedurzeiger-Dummy-Argumente zu unterscheiden.

+0

Ich habe es nicht so gesehen. Vielen Dank :) –

Verwandte Themen