我需要编译一个以前使用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?感觉好像我漏掉了一些明显的东西。请给我开导一下。
谢谢!
发布于 2012-06-27 21:50:07
你看到的是非标准的Fortran。在Compaq Fortran中,#被用来作为十六进制常量的前缀,正如其中一个注释所建议的那样。正如另一个注释所建议的,十六进制常量的标准前缀是Z,数字应该用'‘标记括起来。因此,应该将非标准#2020202C转换为标准Z'2020202C'。
至于尾随的C,我认为它只是一个十六进制数字。
发布于 2012-06-27 23:05:17
这只是一个评论:
除了是非标准表示法中的十六进制文字外,这些字符串也是适合32位整数值的ASCII字符串。当存储在内存中时,#20202030是'___0'还是'0___',这取决于体系结构的字节顺序,而#2020202C是'___,'或',___' (下划线表示空白)。用空格填充是标准的Fortran行为,将8位字符存储到用空格填充的32位类型中,而不是NUL-s,例如使用#20202030而不是#00000030,对Fortran程序员来说应该不足为奇。
在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++非常相似。
IATA数组是如何定义的?如何为其元素赋值?
https://stackoverflow.com/questions/11227282
复制相似问题