【问题标题】:How to force compiler to interpret omitted intent as intent(inout)如何强制编译器将省略的意图解释为意图(inout)
【发布时间】:2016-01-02 09:39:32
【问题描述】:

这个问题与问题有关:如何检测子程序内部对intent(in)的违反。但是我在相关问题Enforce intent(in) declared variables in Fortran as constant also in called subroutines/functions中没有找到答案。

声明为intent(in) 的变量可以通过省略意图声明的另一个子程序/函数进行修改。

例如:

module test
  implicit none
  contains

  subroutine fun1(x)
    real(8), intent(in)::x
    call fun2(x)
  end subroutine

  subroutine fun2(x)
    real(8) :: x
    x = 10
  end subroutine
end module

gfortran 和 ifort 可以编译此代码而不会出现任何错误/警告。所以我的问题是:

  1. 是否可以禁止省略意图声明?
  2. 是否可以强制 Fortran 编译器将省略的意图解释为 intent(inout)

【问题讨论】:

    标签: fortran


    【解决方案1】:

    两个答案都是否定的。未指定的意图与所有其他意图根本不同。它与 intent(inout) 不同,因为您可以将不可定义的表达式传递给具有未指定意图的子例程。

    此外,在许多情况下,根本不允许指定意图(过程参数、Fortran 95 中的指针……)

    如果您想要指定意图,您可以将您的子例程定义为pure,但它的作用远不止于此。但这对你来说可能是正确的。它禁止任何副作用。

    【讨论】:

    • 所以这意味着没有办法确保intent(in)不会因为非“纯”子程序而被违反?顺便感谢“纯”提示。
    • 不幸的是,调用程序不能查看其他程序的内部。它甚至可以看到它的界面,例如声明的意图。
    【解决方案2】:

    我认为由于自动定义的接口,你应该得到一个编译错误。例如,对于错误的维度,我会期望相同(我将 fun2 虚拟参数 x 切换为 z,我认为这更清楚地说明了我的观点)。

    module test
      implicit none
      contains
    
      subroutine fun1(x)
        real(8), intent(in)::x
        call fun2(x)
      end subroutine
    
      subroutine fun2(z)
        real(3) :: z
        z = 10
      end subroutine
    end module
    

    【讨论】:

    • 这个答案毫无意义。没有“自动定义的接口”;更改虚拟参数的名称根本没有效果;它似乎混淆了种类和维度的概念。
    猜你喜欢
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    相关资源
    最近更新 更多