Fortran 90存在可选参数

问题描述 投票:9回答:2

我不了解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”。在两种情况下,我都希望看到“当前检查:F F”,因为我只使用3个非可选参数调用了子例程,而没有两个可选参数。我无法理解为什么它会以这种方式运行,并且这正在导致我正在开发的程序中出现重大错误。我感谢任何见识。谢谢。

fortran optional-parameters fortran90
2个回答
7
投票

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.