4

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

      subroutine sub(hello,world,this,routine,takes,a, &
     &   crazy,large,number,of,arguments,              &
     &   so,many,that,it,gets,split,across,four,       &
     &   lines)

5列目のアンパサンドは、ユーザーがf77コンパイラーでコードをコンパイルしたい場合のようです。私の質問は、これが正当な(標準準拠の)Fortran90コードであるかどうかです。末尾のアンパサンドも列73にないため、おそらく標準に準拠したf77コードではないと思います...しかし、そうであった場合、これはフリーフォーマットおよび固定フォーマットのコンパイラを満足させる標準的な方法でしょうか?言い換えれば、Fortran 90標準では、行の途中にある&は単に無視される(またはその効果をもたらす何か)と言っていますか?

4

3 に答える 3

6

&は、Fortran90の自由形式の継続文字です。コンパイラは、末尾の&の位置を次の行の先頭の&と一致させることにより、行が連結されているかのように動作します。Fortranはトークン間のスペースを無視して喜んでいるので、あなたが投稿したものは、多数のソースファイル行にわたって非常に長いステートメントを書く方法です。(OPはおそらくこれをすべて知っていますが、他の読者は知らないかもしれません。)

表示するスニペットは、間違いなく標準に準拠したFortran 90です。標準では、末尾の&を継続文字として定義しています。トークン(変数名など)または「文字コンテキスト」(文字列リテラルなど)のいずれかを行間で分割する場合、継続が実行される行は&で始まり、空白があってはなりません。行頭の&の後に文字のシーケンスに挿入されます。あなたが投稿したものは、連続する&sが既存の空白に空白を導入していないと見なされる可能性があるという理由で、標準準拠に潜入していると思います。

ただし、スニペットでは行頭の&sは必要ありません。

あなたのスニペットは間違いなく標準に準拠した固定形式のFORTRAN77ではありません。ただし、最新のFortranコンパイラーのほとんどは、特に指示がない限り、この種の「標準に準拠していない」が「明白な意味を持つ」コードをリラックスして表示し、非常に楽しくコンパイルします。つまり、既存の固定形式のソースファイルに自由形式のコードを追加するような奇妙なことを試みない限り、それはコンパイラにヒッシーフィットを要求するだけです。

編集

私の最初の答えは、固定形式と自由形式のコンパイルを幸せに保つためのコードを作成するための戦術として、&sを73列目に移動することに関するOPの質問に答えることができませんでした。FORTRAN77では、継続は継続行の列6の文字(任意の文字)でマークされます。そのバージョンの言語では、継続される行の終わりに文字は必要ありませんでした。繰り返しになりますが、73列に&を入れても何も問題はありません。OPがコメントで指摘したように、固定形式のFortranは73-80列の文字をすべて無視し、パンチカード(ああ、幸せな日)は80文字しかありませんでした列。

しかし、私もこのアプローチを推奨するものは何も見当たりません。同じソースファイルに自由形式と固定形式を混在させない方がはるかに望ましいと思います。現在のすべてのFortranコンパイラーは、同じコンパイルで両方のフォームをコンパイルします。ただし、先に進んで2つを混合したい場合は、自由に行ってください。

于 2012-05-14T14:06:59.197 に答える
1

はい、これはFortran 90に準拠しています。次の行の最初の非空白文字が「&」の場合、実際のソーステキストは次の非空白文字から始まります。

于 2012-05-14T14:03:04.497 に答える
0

ハイパフォーマンスマークの答えは正しいですが、継続のための固定(F77)形式と無料(F90以降で許可されている)形式についてもう1つの重要なポイントがあります。&まず、提供されたコードの6列目に文字が含まれているように見えます。もしそうなら、それはほとんどF77互換です。必要なのは、行末の末尾のを削除する&か、73列に移動することだけです。HristoIlievが指摘したように、&73列と6列の両方でを使用すると、複数のFortranに準拠する形式が可能になります。標準INCLUDE。単一の標準に固執しない環境でコーディングする場合 のステートメントに役立ちます。

于 2016-10-14T11:59:42.007 に答える