2010-12-03 14 views
0

私はこれを行うと非常に奇妙な動作が発生しています。私はこれが問題の起源だと考えていますが、私は間違っている可能性があります。あなたのいずれかが、これは確かに未定義の動作であることを確認できた場合、私は、少なくともfortran 90のインテント(アウト)スプライスされた配列の動作は未定義ですか?

に何が起こっているのか知っているだろう、私は(コンパイルするふりをしない)があるとし

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 

私の質問は:私は奇妙な何かをやっています?私は、たとえスライスを通過したとしても、インテント(アウト)がブロック全体を定義していないと感じ、インアウトが必要です。あなたは標準から確認できますか?

編集:inoutは、未定義の動作と同じですが、スライスされていない配列をSubに渡します。これは、サブブロックの初期化のためにスライスされた配列を渡すことが標準に違反していることを意味しますか?あなたはスライスを渡す場合

おかげで、すべての

答えて

2

まず、私はあなたが全体の配列を代入するつもりはないので、私はそれについて完全にはよく分からないが、あなたは、意図(INOUT)を使用する必要があります疑いますこの場合、インテント(out)が正しいかもしれません。

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

コードに明示的なインターフェイスを追加し、ブロック1に割り当て、コンパイルした後、スライスを定義できました。どのような未定義の振る舞いが見えていますか?

+0

私は明示的なインターフェースを持っています。私はちょうど問題の非関連コードを手に入れませんでした。未定義の振る舞いは、コードではまったく触れられていない型に含まれるポインタの割り当てを解除(または再割り当て、またはランダムメモリへの送信)します。 –

+2

問題を再現するコードを提供してもらえますか? – steabert

+0

それは非常に難しいだろう。しかし、私はちょうど問題を回避したので、この時点では単なる好奇心です。 –

関連する問題