7

検討:

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で動作します)割り当てられていない配列を最初に渡しますが、それに触れません-これがシステムに依存する方法で動作する原因となる可能性のあるものは標準にありますか?

4

2 に答える 2

6

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

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

そして、はい、私はそれに噛まれてきました。私の回避策は、呼び出しの前にゼロサイズに割り当てることでした。

于 2012-11-21T15:44:44.153 に答える
3

Ian Bushの回答は、質問での使用は許可されていないと正しく述べています。ただし、より正確にすることもできます。(括弧内のFortran 2018標準への参照。)

割り当てられていない割り当て可能な実際の引数が使用される可能性があるのは、次の3つの場合です。

  • ダミー引数も割り当て可能である場合(Fortran2003またはFortran95 + TR-15581以降のみ)(15.5.2.6 p.2)
  • ダミー引数がオプションの通常引数の場合(Fortran 2008以降のみ)(15.5.2.12 p.1、15.5.2.4 p.7)
  • 手続きが本質的な照会機能である場合(15.5.2.4 p.7、16.1 p.2)

「未使用」のダミー引数も例外ではありません。これらの制限は、割り当て可能な引数が配列であるかスカラーであるかに関係なく適用されます。

その他の使用は、プログラムが不適合であることを意味します(15.5.2.4 p.7、15.5.2.7 p.2)。

適合プログラムでは、これらの受け入れ可能なケースのそれぞれに、使用可能な明示的なインターフェースがあります。割り当て可能またはオプションのダミー引数には1つ(15.4.2.2 p.1(3))が必要であり、アクセス可能な組み込みプロシージャには常に明示的なインターフェイスがあります(15.4.2.1p.1)。

プログラムに対するこれらの要件は、コンパイラが分析できるようにするために必要な要件ではありません。このような不適合なプログラムは、必ずしもコンパイルおよび実行時に問題が発生することを意味するわけではありません。悪い方法で逆参照を試みない質問のプログラムの場合、あなたはそれでうまくいくかもしれません。ただし、不適合なプログラムを作成することは良くなく、それらが「機能する」ことに依存することは非常に悪いことです。

物事がうまくいかないかもしれないいくつかの方法があります:

  • 実行時チェック
  • コンパイル時のチェック
  • 属性を持つダミーvalue(この場合も、明示的なインターフェイスが必要です)

つまり、プログラムは、一部のコンパイラ/コンパイラオプションで異なる動作をする可能性があります。明示的なインターフェイスを使用できるようにする必要があることに気付いた場合、コンパイラはプログラムのコンパイルを拒否することがあります。ランタイムが引数が割り当てられているかどうかをチェックする場合、プログラムはサブルーチンに入るときに中止することがあります。value実際の引数が割り当てられていないときに、属性を使用して配列の匿名で定義可能なコピーを作成しようとすると、ランタイムが非常に予期しない動作をする可能性があります。


質問については、心配すべきもう1つのコンプライアンス違反があります。明示的な長さのダミー引数foo(n)は、実際の引数に少なくともn要素が必要であることを意味します。割り当てられていない配列には、少なくともn要素がありません(ゼロの場合でもn)。もしコンパイラーfoointent(out)その権利の範囲内で、実際の引数のこれらの要素を「定義解除」するために何かをしているとしたら。これは失敗する可能性があります。

于 2021-06-21T14:49:54.150 に答える