EQUIVALENCE
何もしません、それは確かに何も初期化しません、それEQUIVALENCE
は定義または宣言です。最近(そして、常に力が増しているFortran 90標準の公開以来)EQUIVALENCE
はハックであり、可能な限り避ける必要があります。
このステートメントは、2つの変数がストレージ(Fortran標準ではstorage-associationと呼ばれるもの)を共有することを宣言しています。これの解釈の1つは、同等の名前は単なるエイリアスであるということですが、ステートメントの(乱用)使用により、プログラマーは21世紀のプロのソフトウェアエンジニアによって危険と見なされる他のいくつかのことを行うことができます。
たとえば、これは投稿したスニペットに適用され、EQUIVALENCE
さまざまなタイプの変数が同じストレージを共有するために使用できます。と呼ばれる配列があり、ASCN
これは(暗黙的に)とREAL*8
呼ばれる配列と同等の型であり、と呼ばれる配列KLCKF2D
は(再び暗黙的に)型INTEGER
です。これが意味するのは、ある名前でストレージを参照する場合、ビットパターンはsとして解釈されREAL
、別の名前を使用するとsであるということです。また、値を持つ実数のビットパターンは(もちろん)そうではないINTEGER
ことに注意してください。100.0
整数として解釈され100
ます。
そして、ハッカーはそれだけではありません。ブロック宣言の効果の1つCOMMON
は、変数をメモリに配置することです。この場合、の10500 (= 100*21*5)
要素の後にはの要素ASCN
が続きます。少し乗算と加算を行うと、このプログラムのデフォルトの整数サイズが4バイト、つまり他の変数で使用されているsの半分のサイズと一致することがわかります。したがって、配列はより大きくなりますが、元のプログラマーは次のバイトがによって占有されることを知っていました。8700
FEMPTY2
38400 = 2*(10500+8700)
REAL*8
KLCKF2D
ASCN
17400
FEMPTY2
そうです、これはプログラムのメモリ内データのその部分のすべてのビットをに設定する方法かもしれませんが、0
それは(現在は)恐ろしいハックです。しかし、それは移植可能でなければなりません-後続のFortran標準は、言語とコンパイラー作成者から廃止された機能を削除することについて非常に保守的でした。したがって、下位互換性はFortranプログラマーにとって非常に重要です。
ああ、そしてあなたの質問に答えるために、はいCOMMON
ブロックは(過去形に注意してください)グローバル変数を宣言して使用するFORTRAN77の方法でした。最近の言語では、変数をaでラップしてMODULE
関連付けることにより、変数をグローバルに共有するように宣言するという、はるかに安全なオプションが提供されUSE
ています。
私は次のような行を見て驚かなかったでしょう
COMMON/COMMF2D/KLCKF2D(38400)
コードでは、COMMON
ブロックを(ab-)使用して、ストレージの場所の名前を変更したり、再入力したりすることもできます。
私があなたの古いコードにキックを与えている間、暗黙のタイピングも最近では眉をひそめています。すべての宣言を明示的にタイプする方がはるかに良いです。