6

COMMONブロックを広範囲に使用し、時にはSAVEステートメントを使用するレガシーコードを扱っています。Fortran標準を参照した後、次のように述べています。

SAVEステートメント内で前後にスラッシュを付けた共通ブロック名の出現は、その共通ブロック内のすべてのエンティティを指定する効果があります。

共通ブロックに変数を配置しても意味がないのはどのような状況SAVEですか? 変数は、その共通ブロックを含む他のプログラム単位でアクセス可能でなければならないので、どうしてそれをSAVE編集できないのでしょうか?

4

2 に答える 2

7

私はあなたと同じ印象を受けていたので、調べなければなりませんでした。

名前のない、いわゆる空白の共通ブロック内の変数のみが、プログラム全体で定義ステータスを保持しているようです。名前付き共通ブロック内の保存されていない変数は、現在アクティブな別のプログラム単位に同じ共通ブロックの共通ステートメントが含まれていない限り、サブプログラムから戻ったときに未定義になります。

標準から (Fortran 77 ですが、最新のものには同様の文言が含まれています):

17.3 エンティティが未定義になるイベント
[...]
6. サブプログラム内で RETURN ステートメントまたは END ステートメントを実行すると、サブプログラム内のすべてのエンティティが次のものを除いて未定義になります。
[...]
d. サブプログラムに出現し、サブプログラムを直接的または間接的に参照している少なくとも 1 つの他のプログラム単位に出現する名前付き共通ブロック内のエンティティー

于 2012-02-24T00:21:20.570 に答える
4

Fortran 77 時代の多くのコンパイラは、"SAVE" が指定されているかどうかに関係なく、すべてのローカル プロシージャ変数を "保存" していました。これは、従来のプログラムが最新のコンパイラで失敗する一般的な理由であり、言語標準で許可されているように、変数がスコープ外になると未定義になります。おそらく、これらの古いコンパイラは、言語標準では要求されていませんが、プログラムの実行中にすべての共通変数の値も保持していたでしょう。

于 2012-02-24T00:50:20.270 に答える