我需要编译一个以前使用过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?感觉我错过了一些明显的东西。请赐教。
谢谢!
答案 0 :(得分:9)
你所看到的是非标准的Fortran。在Compaq Fortran中,#
用于为十六进制常量加前缀,正如其中一条评论所暗示的那样。正如另一条评论所暗示的,十六进制常量的标准前缀是Z,数字应该用''标记括起来。因此,非标准#2020202C
应转换为标准Z'2020202C'
。
关于尾随C
,我认为这只是一个十六进制数字。
答案 1 :(得分:4)
只是评论:
除了非标准表示法中的十六进制文字外,这些也是符合32位整数值的ASCII字符串。存储在内存中的#20202030
'___0'
或'0___'
取决于架构的endiannes而#2020202C
为'___,'
或',___'
(下划线代表空白) )。使用空白填充是标准的Fortran行为,并将8位字符存储为32位类型,填充空白而不是NUL-s,例如对于Fortran程序员来说,使用#20202030
代替#00000030
应该不足为奇。
在C和C ++中从另一个字符中减去'0'
是将0
,1
,2
等字符转换为数字等价物的常用方法(绝对无法使用特殊的Unicode符号)。例如。 '9' - '0'
给出9
,因为9
的ASCII码是0x39(57),而0
的ASCII码是0x30(48)。 Fortran不会像C和C ++那样将CHARACTER
视为整数,并且必须使用ICHAR()
或IACHAR()
将它们转换为ASCII代码,但这段代码的工作原理与C / C类似C ++就可以了。
如何定义IATA
数组?如何将值分配给其元素?