【问题标题】:How to disable default association of optional arguments in the subroutine argument list?如何禁用子例程参数列表中可选参数的默认关联?
【发布时间】:2018-04-01 05:35:49
【问题描述】:

我现有的子程序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 是 新子程序A(a,b,d,e)的可选参数d

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

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

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

【问题讨论】:

  • 欢迎。请阅读tourHow to Ask。适当的格式将使您的帖子更好。使用标签fortran。如果您想将答案限制在旧的和过时的 Fortran 90(通常您不希望这样),您可以添加 fortran90

标签: fortran fortran90 optional-arguments


【解决方案1】:

您不能禁用此行为。 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
    

    【讨论】:

    • 这是一种临时措施,它成为下一代程序员难以理解的维护问题。我想知道对于问题 我有一个 Fortran 2008 程序是否足够长,它包含一个空的派生类型,它似乎被用作许多子例程的可选参数。谁能告诉我 Fortran 发生了什么? :-)
    猜你喜欢
    • 1970-01-01
    • 2019-08-25
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    相关资源
    最近更新 更多