2

私は今日、次のようなコードに出くわしました。

      subroutine foo()
      real blah
      integer bar,k,i,j,ll
      integer :: n_called=1
      save integer

      ...
      end

ここでの意図はおそらくだったようですがsave n_called、それはすべての整数を保存するための有効なステートメントでさえありますか?それとも、名前付きの変数を暗黙的に宣言してinteger保存するのですか?

4

2 に答える 2

5

2番目の解釈は正しいです。Fortranには多くのキーワードINTEGERがあり、そのうちの1つですが、予約語がありません。つまり、キーワードを識別子として使用できますが、これは通常はひどい考えです(ただし、C#に引き継がれ、キーワードの前に@と識別子として使用しますよね?)

SAVEたとえそれが意図されていたとしても、その声明n_calledは表面的なものです。Fortranは、イニシャライザーを持つすべての変数を自動的に保存するため、コードはおそらく意図したとおりに機能します。

 integer :: n_called=1

これn_calledが自動的にSAVEです。これは通常、新しいFortranコードの保守/拡張/作成を余儀なくされたC /C++プログラマーにとっては本当に悪い驚きです:)

于 2012-05-30T14:37:33.920 に答える
3

私はあなたの2番目の解釈に同意します。つまり、ステートメントはsave integer呼び出された変数を暗黙的に宣言し、integerそれにsave属性を与えます。もちろん、Fortranには、プログラムエンティティ名としてキーワードを使用することに対する規則はありませんが、ほとんどの賢明なソフトウェア開発者にはそのような規則があります。

あなたが提示したようにコードスニペットをコンパイルしようとしても、私のコンパイラー(Intel Fortran)は文句を言いません。適切な場所に挿入するimplicit noneと、エラーが報告されます

This name does not have a type, and must have an explicit type.   [INTEGER]

すべての整数変数に属性を与えるという他の解釈はsave、言語標準と矛盾しているように見え、私が今まで出会ったバリエーションではありません。

于 2012-05-30T14:27:25.927 に答える