3

以前にCompaqFortranコンパイラを使用していた古いFortranプログラムをコンパイルする必要があります。'#'で始まる定数が何であるか理解できないようです。gfortranは構文エラーだと言っており、多くの答えを見つけることができないようです。

CHAR2 = IATA(KK) - #20202030
CHAR3 = IATA(KK+1) - #20202030

どんな定数#20202030ですか?コメントによると、このコードはIATAで2つのASCII文字を取り、それらをバイナリに変換する必要があります。誰かがこれを説明できますか?

さらに下:

IF (IATA(KK+1) .EQ. #2020202C) THEN

これで、最後に「C」があります。どういう意味ですか?

これをgfortranに移植するにはどうすればよいですか?明らかな何かが欠けているような気がします。教えてください。

ありがとう!

4

2 に答える 2

9

あなたが見ているのは非標準のFortranです。Compaq Fortranでは#、コメントの1つが示すように、これは16進定数の接頭辞として使用されます。他のコメントが示唆しているように、16進定数の標準プレフィックスはZであり、数字は''マークで囲む必要があります。したがって、非標準は標準#2020202Cに変換する必要がありますZ'2020202C'

末尾についてはC、16進数だと思います。

于 2012-06-27T13:50:06.840 に答える
4

ただのコメント:

非標準表記の16進リテラルであることに加えて、これらは32ビット整数値に適合したASCII文字列でもあります。メモリに格納されて#20202030いる'___0'場合'0___'、またははアーキテクチャのエンディアンに依存しますが、はまた#2020202Cはです'___,'',___'アンダースコアは空白を表します)。ブランクを使用したパディングは標準のFortranの動作であり、8ビット文字をNULの代わりにブランクをパディングした32ビットタイプに格納します。たとえば、の#20202030代わりにを使用することは#00000030、Fortranプログラマーにとって当然のことです。

CおよびC++では、別の文字から減算することは、、などの'0'文字を同等の数値に変換する非常に一般的な方法です(これは、特別なUnicode記号では絶対に機能しません)。たとえば、のASCIIコードは0x39 (57)であるのに対し、のASCIIコードは0x30(48)であるためです。Fortranは、CおよびC ++のように整数として扱わず、ASCIIコードを使用または変換する必要がありますが、それでもこのコードはC /C++の場合とほとんど同じように機能します。012'9' - '0'990CHARACTERICHAR()IACHAR()

IATA配列はどのように定義されていますか?その要素に値はどのように割り当てられますか?

于 2012-06-27T15:05:16.987 に答える