4

この質問は、サブプログラム内の違反を検出する方法という問題に関連していますintent(in)。しかし、関連する質問で答えが見つかりませんでしたEnforce intent(in) defined 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)ますか?
4

2 に答える 2

4

どちらの答えもNOです。不特定の意図は、他のすべての意図とは根本的に異なります。インテントを指定せずにサブルーチンに定義不可能な式を渡すことができるため、intent(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 に答える