2012-11-21 4 views
5

は考えてみましょう:割り当てられていない配列を明示的なインタフェースなしでルーチンに渡すことに何か問題はありますか?

program main 
real, allocatable, dimension(:) :: foo 
integer n 
n=10 
call dofoo(foo,n,1) 
allocate(foo(n)) 
call dofoo(foo,n,0) 
end program main 

subroutine dofoo(foo,n,mode) 
real foo(n) 
integer i,n,mode 
if(mode.eq.1)then 
    n=6 
    return 
endif 
do i=1,n 
    foo(i)=i 
enddo 
return 
end subroutine dofoo 

は、上記のコードに何か問題はありますか? (これはgfortranで動作します)私は割り当てられていない配列を最初に渡しますが、私はそれに触れません - システムに依存するような振る舞いをする可能性のある標準はありますか?

答えて

5

ほとんどあなた自身の質問に答えました。はい、標準では、スコープ内にインタフェースを持たない場合は、割り当てられていない配列を実際の引数として渡すことは常に不正です。

スコープ内にインターフェイスがある場合、ダミー引数も割り当て可能な場合のみ有効です。

はい、私はそれに噛まれました。私の仕事は、呼び出しの前にサイズをゼロにすることでした。

+0

ありがとうございました。私はこれが事実だと心配しました。私は標準が何を言わなければならなかったのか分かりませんでした(私はf77標準に精通していますが、実際にはほとんどのf90規格を読んでいませんでした) – mgilson

+0

上記のコードはgfortranバグを編集しました) – mgilson

+3

割り当て可能な配列を渡すことは、F95標準へのTRまでクリアされませんでした。割り振られた配列変数の_part_は、割り振られた状態と次元です。インテント(イン)やインテント(アウト)のようなものは、配列の_values_が変更できるかどうかだけでなく、サイズや割り当て状況が変更できるかどうかを伝えるため重要です。明示的なインタフェースがなければ、プログラムは割り当て可能な配列を渡すときに最悪の場合を想定しなければならなくなります。これは通常のケースでは大きなパフォーマンス上のペナルティなので、明示的なインターフェイスが必要であると判断されました。 –

関連する問題