Функциональный интерфейс в Fortran 90/95 - PullRequest
3 голосов
/ 12 июля 2011

У меня есть программа, которая вызывает подпрограмму, которая затем вызывает функцию.Меня несколько смущают требования Фортрана к объявлению типа функции.Я объявил тип в функции (т. Е. Настоящая функция foo (...)), и программа работает независимо от того, объявляю ли я функцию в разделе объявления подпрограммы.

Мой конкретный вопрос: не будуОбъявление функции в подпрограмме потенциально может привести к неожиданному поведению в будущем?Я также видел интерфейсный блок и мне интересно, нужно ли это тоже.

В целом, меня также интересует, что Fortran делает «за кулисами» и почему это было бы более или менее важно дляобъявите функцию или используйте интерфейсный блок.

РЕДАКТИРОВАТЬ: Пример кода:

program foo
  real :: a,b,c

  call bar(a,b,c)
end program foo

subroutine bar(a,b,c)
  real :: a,b,c

  c = baz(a,b)
end subroutine bar

real function baz(a,b)
  real :: a,b

  baz = a*b
end function baz

1 Ответ

5 голосов
/ 12 июля 2011

Лучший подход - объявить функцию в функции, а затем поместить функцию в модуль. Затем «используйте» функцию из любой основной программы или процедуры (подпрограмма или функция), которая вызывает эту функцию. Таким образом, вызывающая программа или процедура будет знать интерфейс к функции и сгенерирует правильный код. В терминологии Фортрана интерфейс является явным. Если функция вызывается из процедуры в том же модуле, вам не нужно «использовать» ее, потому что процедуры в модуле осведомлены друг о друге. См. Вычисление перекрестного произведения двух векторов в Фортране 90 для примера. Обычно нет необходимости использовать интерфейс, если только вы не вызываете процедуру, для которой вам не хватает исходного кода, или на другом языке, например, C, доступ к которому осуществляется через привязку ISO C.

...