2

g77 コンパイラでコンパイルされ、gfortran で失敗する古い (~1995) レガシー fortran コードがいくつかあります。問題は次の行にあります (互換性のない型変換、文字から整数へ):

INTEGER  CKYAN
DATA     CKYAN / 'KYAN' /

変数 CKYAN は、トリガーとして 1 回だけ使用されます。

IF(IWVTX.EQ.CKYAN)THEN
    CALL FDCVERTEXSWITCHTOKYAN()
ENDIF

整数 IWVTX は、入力ファイル (文字列 'KYAN' またはその他の文字列) から読み取られます。

私は fortran で重要な経験がなく、文字列から整数変数を初期化するときに何が起こっているかについてのドキュメントを見つけることができません。g77 コンパイラで確認しました。次のコード:

  INTEGER it,ita,it1,it2,it3,it4,it5,it6
  DATA it  / 'KYAN' /
  DATA ita / 'KYAN' /
  DATA it1 / 'K' /
  DATA it2 / 'Y' /
  DATA it3 / 'A' /
  DATA it4 / 'N' /
  DATA it5 / 'O' /
  DATA it6 / 'o' /
  write(*,*) 'test', it, ita, it1, it2, it3, it4, it5, it6

出力を生成します:

1312905547 1312905547 538976331 538976345 538976321 538976334 538976335 538976367

したがって、文字列が等しい場合、数値も等しくなります。ある文字が別の文字の隣にある場合、そのコードは 1 増加します。

質問は次のとおりです。

  1. ここで何が起こっているのですか?
  2. 同じで利用可能なgfortranを実行する関数はありますか?
  3. または、他のファイルに触れずに、これを修正する簡単な方法はありますか?

誰でもこれで私を助けることができますか? 前もって感謝します。

4

1 に答える 1

2

うわー-これは1995年に書かれたものですか?ええ。

私が知る限り、これは基本的にホレリス エンコーディングであり、文字定数を整数でエンコードします (CHARACTER データ型が存在する前から)。簡単なテストとして、これらの整数の 1 つを 4HKYAN に設定すると、同じ答えが得られるようです。

ここでの理由は、後でテストする定数に等しいフラグを設定するためのようです。同じことをしたい場合、これを行う最新の方法は です。これはckyan = transfer('KYAN',ckyan)、文字列のビット表現を取り、それを 2 番目のパラメーターとして渡された変数の形式に変換して返します。

しかし、ここでは、さまざまなケースで IWVTX が取ることができる値が異なる限り、名前付き定数の値は重要ではないようです...

ところで、これについてはすでにご存知かもしれませんが、Fortran Wiki には、Old Fortran の近代化に関する非常に便利なページがあります。すべてをカバーしているわけではありませんが (これは、これまでまったくこの形式で見たことがありませんでした)、多くの古い非標準の構造を最新の Fortran に変換するのに役立ちます。

于 2011-04-18T14:18:36.013 に答える