簡體   English   中英

是否仍在編譯器中實現Fortran控制字符(托架控制)?

[英]Are Fortran control characters (carriage control) still implemented in compilers?

在《 Fortran 95/2003 for Scientists and Engineers 》一書中,有很多話題談到認識到format語句中的第一列保留用於控制字符的重要性。 我還在互聯網上看到了控制字符,稱為回車控制。

為避免混淆,通過控制字符,我將字符“ 1,空白(即\\ s),0和+”稱為“”,當放置在a的第一列(字符)時會影響輸出的垂直間距FORMAT語句。

另外,請參見完全以固定寬度字體寫的此純文本網頁: Fortran運輸控制 (因為沒有什么比等寬字體更好地尖叫准確性和上古了)。 我發現此頁面和其他類似頁面尚不清楚。

unintended output. 根據Fortran 95/2003 for Scientists and Engineers科學家和工程師的Fortran 95/2003) ,如果不記得第一列是為托架控制保留的,可能會導致意想不到的輸出。 釋義戴夫·巴里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 for Scientists and Engineers”的建議非常出色。 對於終端機,附言和其他現代打印機,第一欄不再特別。 我不再特別關注第一列,也沒有遇到麻煩。

Fortran 2003標准將回車控制列為已刪除 ,這是Fortran語言標准很少執行的操作。 請參見“ Fortran 95/2003的說明”的第359頁或“ Fortran 2003手冊”的第326頁。 也許使用gfortran選擇-std = f2003或-std = f2008可以確保不會將第1列用於回車控制,這樣就完全不可能出現“壞事”。

would do special things based upon the content of column 1. Note that line printers didn't have a print head that moved back and forth--they had a chain or drum and 132 hammers, each associated with a byte in a buffer. 常見的打印機將根據第1列的內容執行特殊操作。請注意,行式打印機沒有可前后移動的打印頭-它們有一個鏈或鼓以及132個錘子,每個錘子與一個字節相關聯。緩沖。 當錘子前面的字符與緩沖區中的字符匹配時,錘子將通電,緩沖區的該字節將被消隱。 當整個緩沖區為空時,打印機將加載下一行。

打印機沒有回車,換行或換頁控制字符的概念。 取而代之的是,他們使用緩沖區的第一個字符來指示在打印每一行之前紙張應該做什么。 某些法規會將紙張提前固定數量; 其他代碼將選擇紙帶閱讀器上的(IIRC)八列之一,並將打印紙和紙帶一起推進,直到在適當的列上發現一個孔。 傳統上,紙帶將是一個與打印頁面長度相同的環,第1列將有一個孔; 紙張將排成一行,以便在應該在每頁上開始打印的位置發生第1列保留。 我讀過一家使用雙倍長度類型的商店,其第7列和第8列排列成扇形紙的向內和向外穿孔。 好招-我想知道這有多普遍。

無論如何,回車控制字符可能是與該語言密切相關的約定,但它們是硬件功能而不是語言功能。 的確,除了大多數(如果不是全部)商店正好以這種方式設置其運輸控制帶這一事實之外,沒有特別的保證可以將“ 1”放到頁面頂部。

是的,盡管默認情況下經常將其禁用,但Fortran編譯器仍支持Fortran托架控制。 例如,在Intel Fortran中,需要使用非標准(但已廣泛實施)CARRIAGECONTROL ='FORTRAN'選項打開文件。 看一下gfortran是否有類似的東西。

就是說,我不建議您使用此約定對新應用程序進行編碼,因為它可能無法在所有輸出設備上以您希望的方式工作。

我相信Fortran 95是最后一個在打印輸出的第1列中為字符指定特殊含義的版本。

定義了托架控制字符以輸出到打印機。 沒有輸出到其他類型的設備(例如打孔卡,紙帶或那些新奇的磁性旋轉圓形物品)。 如果輸出到磁盤文件,則gfortran做正確的事。

編輯:gfortran確實在做正確的事情。 如果要命令打印機驅動程序解釋Fortran托架控制字符而不是按字面意義打印它們,請在lpr命令中使用f過濾器選項進行說明。 參見例如http://www.computerhope.com/unix/ulpr.htm

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM