Элементарные функции Fortran и элементарные подпрограммы

Фортан позволяет элементарным подпрограммам иметь аргументы намерения (inout) и намерение (out), но элементарные функции могут иметь только намерение (in).

Это почему? Это просто стилистическое соглашение или есть что-то общее в вызове функций и вызове подпрограмм?

Другими словами,

Elemental Integer Function FOO(i)
  Integer, intent(in) :: i
    ...
  FOO=something
End Function

и

Elemental Subroutine FOO(i, v)
  Integer, intent(in)  :: i
  Integer, intent(out) :: v
    ...
  v=something
End Subroutine

эти реализации FOO одинаково эффективны?


person drlemon    schedule 29.07.2011    source источник
comment
Я не могу понять это, нет особого смысла называть это чистой процедурой, если у нее есть побочные эффекты. Рискну предположить и скажу, что функция elemental может быть более эффективной в контексте распараллеливания, поскольку компилятору ясно, как ведет себя процедура.   -  person bdforbes    schedule 30.07.2011
comment
Я думаю, что если подпрограмма изменяет только свои собственные аргументы и не затрагивает глобальные переменные, эффективно скомпилировать такую ​​подпрограмму несложно. Имеет смысл иметь такой функционал. Например, генератор случайных чисел должен изменить состояние последовательности случайных чисел (описанной массивом целых чисел) и вернуть случайное число. Таким образом, он должен иметь один аргумент намерения (inout) и один аргумент намерения (out). Конечно, пользователь может все испортить, передав общие переменные такой подпрограмме. Но опять же, ни одна парадигма программирования не является надежной.   -  person drlemon    schedule 31.07.2011


Ответы (1)


Нет смысла иметь элементарную подпрограмму без хотя бы одного аргумента, помеченного как intent(out) или intent(inout), потому что вам нужно каким-то образом передать результат. Функция имеет возвращаемое значение, подпрограмма должна использовать свои аргументы. В Fortran 2008 элементарные процедуры AFAIK не обязательно должны быть чистыми, но трудно представить себе полезную элементарную подпрограмму только благодаря ее побочным эффектам.

person Vladimir F    schedule 12.12.2011