Подтвердить что ты не робот

Перегрузка функций с помощью Fortran

В 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

Итак, это плохая практика?

Изменить: Вызов функции с помощью ключевых слов ничего не меняет.

4b9b3361

Ответ 1

Ваш пример отлично подходит. Их можно отличить ТИП аргументов. Тогда имена не важны. В вашем случае тип аргумента cur отличается.

Аргументы с тем же именем могут различаться по типу, виду или рангу (совместимость с TKR).

Пункт указанной статьи состоит в том, что вы не можете различать две конкретные процедуры только с помощью ORDER аргументов. Это связано с тем, что процедуры могут быть вызваны с помощью аргументов ключевого слова в любом порядке. Это можно преодолеть с помощью разных имен для аргументов.

В противном случае объявление более конкретных процедур для общего типа с одинаковыми именами аргументов, но с разными типами/видами/рангами очень распространено и совершенно корректно.

Fortran 2003/2008 добавляет дополнительные возможности для общего разрешения. Также можно различать процедуры с помощью атрибута pointer/allocatable своих аргументов и аргументов фиктивного указателя процедуры.