如何强制编译器将省略的intent解释为intent(inout)

时间:2012-10-04 12:41:55

标签: fortran

这个问题与问题有关:如何检测子程序中违反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)

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:-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