Fortran 90 可选参数的存在

12

我不明白pgf90 7.2中present()内在函数的行为。我写了一个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"。无论哪种情况,我都只使用了带有3个非可选参数的子例程,并没有使用可选参数。我无法理解为什么会出现这种情况,这导致我正在开发的一个程序出现了严重的错误。感谢您的任何见解。谢谢。
2个回答

11

你是否将此子程序放在一个模块中,并在调用例程(主程序或子程序)中使用该模块的 "use" 语句?一个典型的规则是,Fortran 90 的许多高级 / 新特性要求明确的接口,以便调用方和被调用方一致地传递参数。最简单和最好的方法是使用模块 / use。只是猜测...


2
你说得完全正确。将该过程放在一个模块中给了我预期的响应。谢谢。 - Jason
我曾经遇到过非常类似的问题,但是通过在调用函数中放置一个显式接口声明,我成功地解决了它。这是我永远也无法挽回的一周时间啊... - Tim Supinie

1

在现代Fortran中,可选参数必须在调用函数中声明为可选(通过模块或显式接口)。在Fortran 77中,如果最后一个参数是标量数字,则可以简单地省略它,因此可选参数可以在调用例程中传递而无需进行额外的声明。这可能不是Fortran标准的一部分,但它是由明智的编译器实现提供的有用功能。不幸的是,现代Fortran取消了这个很棒的功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接