compiler-construction - Fortran 控制字符(回车控制)是否仍在编译器中实现?

标签 compiler-construction fortran gfortran control-characters

书中Fortran 95/2003 for Scientists and Engineers ,有很多关于认识到格式语句中的第一列是为控制字符保留的重要性的讨论。我还在互联网上看到了被称为回车控制的控制字符。

为避免混淆,对于控制字符,我将字符“1、空白(即\s)、0 和 +”称为当放置在FORMAT 语句。

另外,请参阅这个完全用固定宽度字体编写的纯文本网页:Fortran carriage-control (因为没有什么比等宽字体的散文更能体现准确性和古老性了)。我发现这个页面和其他类似的页面不太清楚。

根据Fortran 95/2003 for Scientists and Engineers ,如果不记得第一列是为回车控制保留的,可能会导致可怕的意外输出。释义 Dave Barry ,输入错误的字符,核导弹就会向挪威发射。

然而,当我试图遵守这个严厉的警告时,我发现 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)

最佳答案

在过去的几年里,忽略第一列的这种使用可能会导致行式打印机出现问题,例如弹出页面 - 但是您最后一次看到行式打印机是什么时候?否则,它取决于输出设备、编译器和操作系统。大约 15 或 20 年前,“Fortran 95/2003 for Scientists and Engineers”的建议非常好。对于终端、postscript 和其他现代打印机,第一列不再特别。我不再特别关注第一列,也没有遇到麻烦。

Fortran 2003 标准将回车控制列为 已删除 ,这是 Fortran 语言标准很少做的事情。请参阅“Fortran 95/2003 解释”的第 359 页或“Fortran 2003 手册”的第 326 页。也许使用 gfortran 选择 -std=f2003 或 -std=f2008 将保证第 1 列不会用作回车控件,因此完全不可能出现“坏事”。

关于compiler-construction - Fortran 控制字符(回车控制)是否仍在编译器中实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3296237/

相关文章:

Fortran:使用两种不同编译器编译的生成代码之间的差异

fortran - Fortran 77 中的 IEEE_UNDERFLOW_FLAG IEEE_DENORMAL

fortran - 在主程序和函数中使用一致的精度

random - 随机数生成器的上限

io - 使用 MPI-IO 编写 Fortran 格式的文件

java - 通过 JNI 将 Fortran 代码与 Java 集成

c++ - 循环的编译器优化

iphone - 仅在启用编译器优化时发生的 Objective C 段错误

java - UML Activity 图的 AST

c - 编译器如何为变量分配内存地址?