18

Fortran 90 では、インターフェイスを使用して関数をオーバーロードできます。ただし、このサイトによると、これらの関数を同じ引数名で定義することはできません。gfortran では、次のコードで十分に機能するため、問題にはならないようです。

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

それで、そうするのは悪い習慣ですか?

編集:キーワードで関数を呼び出しても何も変わりません。

4

1 に答える 1

19

あなたの例は完全に有効です。それらは、引数の TYPE によって区別できます。その場合、名前は重要ではありません。あなたの場合、cur引数の型が異なります。

同じ名前の引数は、型、種類、またはランク (TKR 互換性) によって区別できます。

参照記事のポイントは、引数の順序だけでは 2 つの特定のプロシージャを区別できないことです。これは、キーワード引数を使用してプロシージャを任意の順序で呼び出すことができるためです。これは、引数に異なる名前を使用することで解決できます。

それ以外の場合、引数の名前は同じであるが、タイプ/種類/ランクが異なる汎用プロシージャのより具体的なプロシージャを宣言することは、非常に一般的であり、完全に有効です。

Fortran 2003/2008 では、ジェネリック解決にいくつかの可能性が追加されています。引数のポインター/割り当て可能属性と、プロシージャーポインターの仮引数によって、プロシージャーを区別することもできます。

于 2012-12-05T11:14:20.677 に答える