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
)。もしコンパイラーfoo
がintent(out)
その権利の範囲内で、実際の引数のこれらの要素を「定義解除」するために何かをしているとしたら。これは失敗する可能性があります。