1
module foo
contains
   subroutine bar()
      integer :: i(3)

      i(1) = 1
      i(2) = 2
      i(3) = 3
      call baz(i, i)
   end subroutine

   subroutine baz(a,b)
      integer, intent(in) :: a(:)
      integer, intent(inout) :: b(:)

      b(2) = 5
      print *, a
      print *, b
   end subroutine

end module
program xx
   use foo
   call bar()
end program

このコードでは、同じ配列iを baz に渡し、異なる意図を持つ引数にバインドしています。もちろん、印刷aすると変わります。これは未定義の動作ですか、それとも仕様によるものですか?

私はこれが起こることを完全に期待していることに注意してください。私はその動作に戸惑っていません。それが有効かどうかを理解したいだけです。

4

1 に答える 1

3

これは未定義の動作です。Fortran は一般に、引数が POINTER または TARGET 属性を持っていない限り、引数のエイリアシング (つまり、同じ実データを指す複数の引数) を禁止します。

于 2012-04-18T12:07:20.643 に答える