0

これを行うと、非常に奇妙な動作が発生します。これが問題の原因だと思いますが、間違っている可能性があります。これが実際に未定義の動作であることを確認できる人がいれば、少なくとも何が起こっているのかを知ることができます

私が持っていると仮定します(コンパイルするふりをしません)

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 に渡すと機能します。これは、サブブロックの初期化のためにスライスされた配列を渡すことが標準に違反していることを意味しますか?

ありがとう

4

1 に答える 1

2

まず、スライスを渡す場合は、配列全体を割り当てるつもりはないため、intent(inout) を使用する必要があると思われますが、それについては完全にはわかりませんが、intent(out) はこの場合。

しかし、問題の原因は、明示的なインターフェイスを持たない、またはモジュールに配置することなく、サブルーチンで想定形状配列を使用するという間違いを犯していることではありませんか? または、コードのその部分を省略しましたか?

コードに明示的なインターフェイスを追加し、ブロックに 1 を割り当ててコンパイルすると、任意の種類のスライスを定義でき、正しく 0 に設定されました。あなたが正確に見ている行動?

于 2010-12-04T00:23:49.353 に答える