これを行うと、非常に奇妙な動作が発生します。これが問題の原因だと思いますが、間違っている可能性があります。これが実際に未定義の動作であることを確認できる人がいれば、少なくとも何が起こっているのかを知ることができます
私が持っていると仮定します(コンパイルするふりをしません)
subroutine X
real, allocatable :: block(:,:)
allocate(block(20,20))
call Sub(block(1:5, 1:5))
! here is undefined behavior
end subroutine
subroutine Sub(b)
real, intent(out) :: b(:,:)
b = 0.0
end subroutine
私の質問は次のとおりです。私は何か変なことをしていますか? スライスを渡したとしても、intent(out) がブロック全体を定義解除しているように感じ、inout が必要です。規格から確認できますか?
編集: inout は同じ未定義の動作をしますが、スライスされていない配列を Sub に渡すと機能します。これは、サブブロックの初期化のためにスライスされた配列を渡すことが標準に違反していることを意味しますか?
ありがとう