9

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)

4

5 回答 5

11

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

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

于 2010-07-21T06:08:26.283 回答
2

普通打印机硬件会根据第 1 列的内容做一些特殊的事情。请注意,行式打印机没有来回移动的打印头——它们有一个链条或鼓和 132 个锤子,每个都与一个字节中的一个字节相关联。缓冲。当锤子前面的字符与缓冲区中的字符匹配时,锤子就会通电,缓冲区的那个字节会被清空。当整个缓冲区为空白时,打印机将加载下一行。

打印机没有回车、换行或换页控制字符的概念。相反,他们使用缓冲区的第一个字符来指示在打印每一行之前纸张应该做什么。某些代码会按固定金额提前纸张;其他代码将选择纸带阅读器上的(IIRC)八列之一,然后将打印纸和纸带一起推进,直到在适当的列上发现一个孔。传统上,纸带将是一个与打印页面长度相同的环,第 1 列将有一个孔;纸张将被排成一行,因此第 1 列的保留将发生在应该在每页上开始打印的位置。我读过一家使用双倍长度类型的商店,第 7 列和第 8 列与折叠纸的朝内和朝外穿孔对齐。

无论如何,回车控制字符可能是与语言密切相关的约定,但它们是硬件功能而不是语言功能。事实上,除了大多数(如果不是所有)商店碰巧以这种方式设置他们的回车控制磁带这一事实之外,没有特别保证“1”会出现在页面顶部。

于 2011-03-15T16:08:03.447 回答
1

我相信 Fortran 95 是最后一个为打印输出的第 1 列中的字符指定特殊含义的版本。

于 2010-07-21T04:20:53.317 回答
1

为输出到打印机定义了回车控制字符。输出到其他类型的设备(例如穿孔卡片、纸带或那些新奇的磁性旋转圆形物体)没有它们。如果您的输出进入磁盘文件,那么 gfortran 正在做正确的事情。

编辑:gfortran 确实在做正确的事情。如果您想命令打印机驱动程序解释 Fortran 回车控制字符而不是按字面打印它们,请在 lpr 命令中使用 f 过滤器选项这样说。参见例如 http://www.computerhope.com/unix/ulpr.htm

于 2010-07-21T05:19:50.903 回答
1

是的,Fortran 编译器仍然支持 Fortran 回车控制,尽管它通常默认禁用。例如,在 Intel Fortran 中,需要使用非标准(但已广泛实施)CARRIAGECONTROL='FORTRAN' 选项打开文件。看看 gfortran 是否有类似的东西。

也就是说,我不建议使用此约定编写新应用程序,因为它可能无法在所有输出设备上按您希望的方式工作。

于 2013-08-01T20:31:30.817 回答