2017-10-20 63 views
0

我现有的子程序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) 

现在。

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

,使其成为

subroutine A(a,b,d,e) 

当我重新编译代码,行如

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

不是由编译器,这是不 我想要什么抱怨。现在,它认为c是新的子程序的 可选参数dA(a,b,d,e)

我可以搜索我的所有代码子程序A的所有出现 避免这种错误的解释,但我错过了,甚至他们中的一个,我会 要付出巨大的代价(错误的结果,痛苦的时刻,...),但一个好的伎俩让 编译器抱怨,我必须解决它们。

这带来了我的问题。如何让编译器不要假设 可选变量的默认关联,除非我在=符号中输入?即,如果我想要 使用一个可选变量,我会将其作为c=2.0D0,e=3.0D0传递给它。 无=符号,有没有办法使它成为默认的非选项 参数?

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

+0

欢迎光临。请阅读[旅游]和[问]。适当的格式将使你的文章更好。使用标签[tag:fortran]。如果您想限制旧的和过时的Fortran 90的答案(通常不需要),可以添加[tag:fortran90]。 –

回答

3

您不能禁用此行为。 Fortran标准规则要求这样做。您将不得不使用不同的语言,但不能使用Fortran。

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

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

2

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

(如果您用于C的派生类型无法在定义模块之外访问的程序,那么这种做法是迫使你的代码的客户端始终使用命名实际参数在过程中参考的一种方式)

例如:

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 
+0

这是一种*临时措施*,它将成为下一代程序员难以解决的维护问题。我想知道SO是否会在这个问题上存在很长的时间?我有一个Fortran 2008程序,它包含一个空的派生类型,它似乎被用作许多子例程的可选参数。任何人都可以告诉我什么是Fortran?* :-) –