4

这个问题与问题有关:如何检测intent(in)内部子程序的违规。但我还没有在相关问题Enforce intent(in) declared variables in Fortran as constant 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)
4

2 回答 2

4

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

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

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

于 2012-10-04T12:50:40.327 回答
-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
于 2013-02-14T14:51:42.467 回答