Наличие дополнительных аргументов в Fortran 90

Я не понимаю поведения встроенной функции present () с pgf90 7.2. Я написал пример программы из 20 строк, чтобы проверить это, но результаты все еще не имеют для меня смысла. Наблюдать:


subroutine testopt(one,two,three,four,five)

  implicit none

  integer, intent(in) :: one,two
  integer, intent(out) :: three
  integer, intent(in), optional :: four
  integer, intent(out), optional :: five

  three = one + two

  print *,"present check: ",present(four),present(five)

  if (present(four) .and. present(five)) then

  five = four*four

end if

end subroutine testopt

если я: вызову testopt (1,2, (любая переменная)) из моей основной программы, он напечатает: «Present check: T F». Однако если я: вызову testopt (1,2, (любая переменная)) из подпрограммы, он напечатает: «Present check: T T». Я ожидал увидеть «текущую проверку: F F» в любом случае, потому что я вызываю подпрограмму только с 3 необязательными аргументами и ни с одним из необязательных. Я не могу понять, почему он так себя ведет, и это вызывает серьезную ошибку в программе, над которой я работаю. Я ценю любую проницательность. Спасибо.


person Jason    schedule 25.06.2010    source источник


Ответы (2)


Помещаете ли вы эту подпрограмму в модуль, а затем используете оператор "use" для этого модуля в вызывающей подпрограмме (основной программе или подпрограмме)? Типичное правило состоит в том, что многие из расширенных / новых функций Fortran 90 требуют явного интерфейса, чтобы и вызывающий, и вызываемый объект передавали аргументы согласованно. Самый простой и лучший способ добиться этого - использовать module / use. Просто предположение...

person M. S. B.    schedule 26.06.2010
comment
Вы абсолютно правы. Размещение процедуры в модуле дало ожидаемый ответ. Спасибо. - person Jason; 28.06.2010
comment
У меня была очень похожая проблема, и я смог решить ее, разместив явное объявление интерфейса в вызывающей функции. Есть неделя, я никогда не вернусь ... - person Tim Supinie; 14.12.2018

В современном Фортране необязательные аргументы должны быть объявлены как необязательные в вызывающей функции (либо через модуль, либо через явный интерфейс). В Fortran 77 можно было просто опустить последний аргумент, если это было скалярное число, поэтому необязательные аргументы можно было передавать без дополнительного объявления в вызывающей подпрограмме. Возможно, это не было частью стандарта Fortran, но это была полезная функция, предоставляемая разумными реализациями компилятора. К сожалению, Modern Fortran убил эту замечательную возможность.

person Norbert S    schedule 25.04.2020