想定サイズの配列を宣言するこれら2つの方法に違いはありますか?
例えば.
real, dimension(:) :: arr
そして
real :: arr(*)
フォーム
real, dimension(:) :: arr
assumed-shape配列を宣言し、フォームは
real :: arr(*)
想定サイズ配列を宣言します。
そして、はい、それらの使用には違いがあります。違いは、おおよそ、コンパイラが想定形状配列の形状を認識しているが、想定サイズ配列の形状を認識していないために発生します。コンパイラーが利用できる追加情報は、とりわけ、仮定された形状の配列を配列全体の式で使用できることを意味します。想定サイズの配列は、配列の形状を必要としないプロシージャ参照の実際の引数である場合にのみ、配列式全体で使用できます。ああ、また、組み込みのlbound
の呼び出しでも、組み込みのubound
の呼び出しではありません。標準または優れたFortranの本をよく読んで明らかになる、他の微妙な、そしてそれほど微妙ではない違いがあります。
新しいFortranプログラマーへのアドバイスは、可能な場合は想定形状の配列を使用することです。これらはFortran90より前には利用できなかったため、古いコードには想定サイズの配列がたくさん表示されます。 shape
関数とsize
関数を使用してサイズをクエリし、範囲外のエラーを回避してallocate
配列を作成できるため、新しいコードでは想定形状の配列の方が優れています。その次元は入力配列の次元に依存します。
ハイパフォーマンスマークの答え 2つのステートメントの違いを説明します-要するに:はい、違いがあります。想定サイズの配列を宣言するのは1つだけです-そしてその意味合い。
ただし、dimension(:)
として言及されていますが、dimension(*)
ではないように思われるので、1つ追加します。
real, dimension(:) :: arr1
real, dimension(*) :: arr2
と同等です
real :: arr1(:)
real :: arr2(*)
または、dimension
ステートメントを使用することもできます。 [私はそれを奨励したくないので、例を書きません。]
質問の重要な違いは、dimension
ではなく*
と:
の使用です。
おそらく、assumed-sizeとダミー引数のいくつかの矛盾がありましたか?これは、この選択が最も一般的なダミーの引数です。