Фортран 90 Наличие необязательных аргументов - PullRequest
9 голосов
/ 26 июня 2010

Я не понимаю поведение встроенной функции 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, (любая переменная)) из моей основной программы, он печатает: «присутствует проверка: TF».Однако, если я: вызываю testopt (1,2, (любая переменная)) из подпрограммы, она печатает: «present check: TT».Я ожидал увидеть «текущую проверку: FF» в любом случае, потому что я вызываю подпрограмму только с 3 необязательными аргументами и ни с одним из необязательных.Я не могу понять, почему он так себя ведет, и это вызывает серьезную ошибку в программе, над которой я работаю.Я ценю любое понимание.Спасибо.

1 Ответ

7 голосов
/ 26 июня 2010

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

...