在书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)
答案 0 :(得分:10)
过去几年,忽略对第一列的这种使用可能会导致行式打印机出现问题,例如页面弹出 - 但是最后一次看到行式打印机是什么时候?否则它是输出设备,编译器和OS依赖。 “Fortran 95/2003 for Scientists and Engineers”的建议在大约15或20年前表现出色。对于终端,后记和其他现代打印机,第一列不再特别。我不再特别注意第一栏了,我没有遇到麻烦。
Fortran 2003标准将运输控制列为已删除,这是Fortran语言标准很少做的事情。请参阅“Fortran 95/2003解释”的第359页或“The Fortran 2003手册”的第326页。也许用gfortran选择-std = f2003或-std = f2008将保证第1列不会被用作马车控制,这样“坏事”就完全不可能了。
答案 1 :(得分:2)
通用打印机硬件会根据第1列的内容做特殊事情。请注意,行式打印机没有可前后移动的打印头 - 它们有链条或鼓和132个锤子,每个锤子与缓冲区中的一个字节相关联。当锤子前面的角色与缓冲器中的角色匹配时,锤子将被激励,缓冲器的那个字节将被消隐。当整个缓冲区为空白时,打印机将加载下一行。
打印机没有回车,换行或换页控制字符的概念。相反,他们使用缓冲区的第一个字符来指示在打印每一行之前纸张应该做什么。某些代码会以固定金额推进该文件;其他代码将在纸带读取器上选择(IIRC)八列中的一列,并将打印纸和纸带推进到一起,直到在适当的列上发现孔。传统上,纸带将是与打印页面长度相同的环,而第1列将具有单个孔;纸张将排成一列,因此在每页打印应该开始的情况下会发生第1列保留。我读过一个使用双长型的商店,并且第7和第8列与折叠纸的向内和向外穿孔对齐。好戏 - 我不知道它有多常见。
在任何情况下,运输控制字符可能是与语言强烈关联的约定,但它们是硬件功能而不是语言功能。事实上,除了大多数(如果不是所有商店)碰巧都设置了这样的马车控制带之外,并没有特别保证“1”会出现在页面顶部。
答案 2 :(得分:1)
我相信Fortran 95是指定打印输出第1列中字符特殊含义的最后一个版本。
答案 3 :(得分:1)
为输出到打印机定义了托架控制字符。输出到其他类型的设备(例如穿孔卡,纸带或那些新奇的磁旋转圆形物品)没有它们。如果您的输出转到磁盘文件,那么gfortran正在做正确的事情。
编辑:gfortran真的做对了。如果要命令打印机驱动程序解释Fortran托架控制字符而不是按字面打印它们,请在lpr命令中使用f filter选项进行说明。例如,参见 http://www.computerhope.com/unix/ulpr.htm
答案 4 :(得分:1)
是的,Fortran编译器仍支持Fortran托架控制,但通常默认情况下禁用它。例如,在英特尔Fortran中,需要使用非标准(但广泛实施的)CARRIAGECONTROL ='FORTRAN'选项打开该文件。看看gfortran是否有类似的东西。
尽管如此,我不建议使用此约定编写新的应用程序,因为它可能无法按照您想要的方式在所有输出设备上运行。