如何在子例程参数列表中禁用可选参数的默认关联?

时间:2017-10-20 04:39:31

标签: fortran fortran90 optional-arguments

我现有的子程序A(a,b,c,d,e)在哪里正常工作 a,b,c是实际参数,de是可选参数。

许多其他子程序调用子程序A,例如

call A(a,b,c)

call A(a,b,c,d=2.0D0)

call A(a,b,c,e=1.0D0)

现在

我决定从子例程c中删除A

所以它变成

subroutine A(a,b,d,e)

当我重新编译代码时,

等行
 call A(a,b,c,e=1.0D0)

没有被编译器抱怨,但事实并非如此 我想要的是。现在,它认为c是 新子例程d

的可选参数A(a,b,d,e)

我可以在我的所有代码中搜索所有出现的子程序A. 避免这种错误的解释,但我甚至想念其中一个我要去的人 付出巨大的代价(错误的结果,痛苦的时刻,......),但这是一个很好的伎俩 编译器抱怨,我必须修复它们。

这引出了我的问题。如何要求编译器不要假设 除非我输入=符号,否则可选变量的默认关联?即,如果我愿意的话 使用可选变量,我会将其作为c=2.0D0e=3.0D0传递。 没有=符号,有没有办法使它成为默认的非可选 争论?

这样,编译器肯定会抱怨,因为c不是 匹配修改后的子程序中的任何现有变量。

2 个答案:

答案 0 :(得分:3)

您无法禁用此行为。 Fortran标准规则要求这样做。你必须使用不同的语言,但不能使用Fortran。

为了防止这种情况,您可以在所有调用的参数列表中为所有参数使用命名参数。

此外,还有一些工具可以帮助您重新调整代码(code refactoring)。您也可以使用简单的grepsed或代码编辑器的搜索和替换功能(它应该能够搜索整个项目或目录)。

答案 1 :(得分:2)

也许作为删除参数之前的临时措施,将伪参数C的类型更改为不同的类型 - 例如,使其成为您为该参数专门创建的派生类型的对象。如果在过程定义中使用该更改的类型重新编译,则编译器将标记仍具有与C对应的位置参数的过程。

(如果在定义过程的模块之外无法访问用于C的派生类型,则此方法可以强制代码的客户端始终在过程引用中使用命名的实际参数。)< / p>

例如:

subroutine proc(a, b, c, d, e)
  real :: a, b, c, d, e
  optional :: d, e
  ...

转到

type, private :: dummy
end type dummy

subroutine proc(a, b, c, d, e)
  real :: a, b, d, e
  type(dummy) :: c
  optional :: c, d, e