在Fortran 95/2003 for Scientists and Engineers一书中,有很多关于认识到格式语句中的第一列是为控制字符保留的重要性的讨论。我还在互联网上看到了被称为回车控制的控制字符。
为避免混淆,对于控制字符,我将字符“ 1、空白(即 \s)、0 和 +”称为当放置在FORMAT 语句。
此外,请参阅这个完全用固定宽度字体编写的纯文本网页:Fortran 回车控制(因为没有什么比等宽字体的散文更能体现准确性和古老性了)。我发现这个页面和其他类似的页面不太清楚。
根据Fortran 95/2003 for Scientists and Engineers,不记得第一列是为回车控制保留的,可能会导致可怕的意外输出。解释戴夫·巴里,输入错误的字符,核导弹就会向挪威发射。
然而,当我试图遵守这个严厉的警告时,我发现 gfortran 不知道我在说什么。
请允许我用一些示例代码来说明我的观点。我正在尝试打印数字 Pi:
PROGRAM test_format
IMPLICIT NONE
REAL :: PI = 2 * ACOS(0.0)
WRITE (*, 100) PI
WRITE (*, 200) PI
WRITE (*, 300) PI
100 FORMAT ('1', "New page: ", F11.9)
200 FORMAT (' ', "Single Space: ", F11.9)
300 FORMAT ('0', "Double Space: ", F11.9)
END PROGRAM test_format
这是输出:
1New page: 3.141592741
Single Space: 3.141592741
0Double Space: 3.141592741
“1”和“0”不是拼写错误。看来 gfortran 完全忽略了控制字符列。
那么,我的问题是:
控制字符是否仍然在符合标准的编译器中实现,或者 gfortran 根本不符合标准?
为清楚起见,这是我的输出gfortran -v
Using built-in specs.
Target: powerpc-apple-darwin9
Configured with: ../gcc-4.4.0/configure --prefix=/sw --prefix=/sw/lib/gcc4.4 --mandir=/sw/share/man --infodir=/sw/share/info --enable-languages=c,c++,fortran,objc,java --with-gmp=/sw --with-libiconv-prefix=/sw --with-ppl=/sw --with-cloog=/sw --with-system-zlib --x-includes=/usr/X11R6/include --x-libraries=/usr/X11R6/lib --disable-libjava-multilib --build=powerpc-apple-darwin9 --host=powerpc-apple-darwin9 --target=powerpc-apple-darwin9
Thread model: posix
gcc version 4.4.0 (GCC)