3

我需要编译以前使用 Compaq Fortran 编译器的旧 Fortran 程序。我似乎无法弄清楚以“#”开头的常量是什么。gfortran 说它是一个语法错误,我似乎找不到很多答案。

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

什么样的常数是#20202030?根据评论,此代码应在 IATA 中采用两个 ASCII 字符并将它们转换为二进制。有人可以解释一下吗?

再向下:

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

现在末尾有一个“C”。这意味着什么?

如何将其移植到 gfortran?感觉就像我错过了一些明显的东西。请赐教。

谢谢!

4

2 回答 2

9

您正在查看的是非标准 Fortran。正如评论之一所暗示的,在 Compaq Fortran 中,#用作十六进制常量的前缀。正如另一条评论所暗示的,十六进制常量的标准前缀是 Z 并且数字应该用 '' 标记括起来。所以非标准#2020202C应该转化为标准Z'2020202C'

至于尾随C,我认为这只是一个十六进制数字。

于 2012-06-27T13:50:06.840 回答
4

只是一个评论:

除了是非标准表示法的十六进制文字外,这些也是适合 32 位整数值的 ASCII 字符串。当存储在内存中时,#20202030'___0''0___'取决于架构的字节序,#2020202C而是'___,'',___'(下划线表示空白)。用空格填充是标准的 Fortran 行为,将 8 位字符存储到用空格而不是 NUL-s 填充的 32 位类型中,例如使用#20202030代替#00000030,对于 Fortran 程序员来说应该不足为奇。

在 C 和 C++ 中'0',从另一个字符中减去是一种非常常见的方法,可以将 、 等字符转换01它们2的数字等价物(这绝对不能用于特殊的 Unicode 符号)。例如,由于 ASCII 码是'9' - '0'0x39 (57),而 ASCII 码是 0x30(48),因此给出。Fortran 不像C 和 C++ 那样将整数视为整数,并且必须使用它们或将它们转换为它们的 ASCII 代码,但该代码仍然像 C/C++ 那样工作。990CHARACTERICHAR()IACHAR()

IATA数组是如何定义的?如何为其元素分配值?

于 2012-06-27T15:05:16.987 回答