10

我不理解 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,(any variable)),它会打印:“present check: T F”。但是,如果我:从子程序调用 testopt(1,2,(any variable)),它会打印:“当前检查:T T”。我希望在任何一种情况下都能看到“当前检查:F F”,因为我只使用 3 个非可选参数调用子例程,而不是可选参数。我无法理解为什么它会以这种方式运行,这导致了我正在处理的程序中的一个主要错误。我很欣赏任何见解。谢谢。

4

2 回答 2

9

您是否将此子例程放在一个模块中,然后在调用例程(主程序或子例程)中为该模块添加一个“使用”语句?一个典型的规则是 Fortran 90 的许多高级/新功能需要一个显式接口,以便调用者和被调用者一致地传递参数。实现这一点的最简单和最好的方法是使用模块/使用。只是猜测...

于 2010-06-26T04:44:02.037 回答
1

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

于 2020-04-25T00:09:21.443 回答