9

Fortran 95/2003 for Scientists and Engineers這本書中,有很多人談到認識到格式語句中的第一列是爲控制字符保留的重要性。我還看到在互聯網上被稱爲托架控制的控制字符。Fortran控制字符(托架控件)是否仍然在編譯器中實現?

爲了避免混淆,通過控制字符,我將字符「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

一些功勞給你的ibiblio作者。他們的文檔包含大量以純文本格式化的表格。選擇比例字體將是一個更糟糕的選擇。不是每個人都有一個標記的源文件! – Pekka 2015-04-11 23:09:19

回答

10

在過去的幾年中,忽略第一列的使用可能會導致行式打印機出現問題,例如頁面彈出 - 但是最後一次是什麼時候看到行式打印機?否則,它是輸出設備,編譯器和操作系統相關的。 「Fortran 95/2003的科學家和工程師」的建議在15年或20年前非常出色。隨着終端,postscript和其他現代打印機,第一列不再是特殊的。我不再特別關注第一欄,我也沒有陷入困境。

Fortran 2003標準列出了托架控件已刪除,這是Fortran語言標準很少做的事情。請參閱「Fortran 95/2003解釋」的第359頁或「Fortran 2003手冊」的第326頁。也許用gfortran選擇-std = f2003或-std = f2008將保證第1列不會被用作一個托架控制,因此「壞事」是完全不可能的。

+2

+1:我不喜歡查普曼的書籍,這是我仍然不知道的原因之一。 – 2010-07-21 09:03:29

+0

+1,但我仍然容忍查普曼的書 – steabert 2011-04-01 08:02:25

1

我相信Fortran 95的是最後一個版本,指定打印輸出的1列字符特殊意義的輸出。

+0

在這種情況下,'-std = g95'可能是一種可能性... – paxdiablo 2010-07-21 04:36:43

+0

在我的gfortran手冊頁中,語法是-std = f95,但我很想感謝您的建議。然而,嘗試這並沒有改變結果。 – EMiller 2010-07-21 05:22:39

+0

@Jerry_Coffin,我也看到了這一點,控制字符在Fortran95後不見了。但是我認爲爲了向後兼容,第一個字符對輸出沒有任何影響,而不是被直接打印。 – EMiller 2010-07-21 05:25:01

1

運輸控制字符被定義爲輸出到打印機。輸出到其他類型的設備(例如衝孔卡片,紙帶或那些新穎的磁性旋轉圓形物體)沒有它們。如果你的輸出進入磁盤文件,那麼gfortran正在做正確的事情。

編輯:gfortran真的是做正確的事情。如果要命令打印機驅動程序解釋Fortran托架控制字符而不是逐字打印,請在lpr命令中使用f filter選項來說明。例如見 http://www.computerhope.com/unix/ulpr.htm

2

常見的打印機硬件會做基於列1.注意內容的特殊的東西,行式打印機並未有前後移動打印頭 - 他們有一個鏈或鼓和132個錘,每個與緩衝區中的一個字節相關聯。當錘子前面的角色與緩衝器中的角色匹配時,錘子將被激勵,並且緩衝器的字節將被消隱。當整個緩衝區爲空時,打印機將加載下一行。

打印機沒有回車,換行或換頁控制字符的概念。相反,他們使用緩衝區的第一個字符來指示打印每行之前紙張應該做些什麼。某些代碼將按固定金額推進該文件;其他代碼會在紙帶閱讀器上選擇(IIRC)八列中的一列,然後將打印紙和紙帶推到一起,直到在相應的色譜柱上出現一個孔。傳統上,紙帶將是一個與印刷頁面相同長度的環,並且第1列將具有單個孔;該文件將排隊,因此第1列保留將發生在打印應在每個頁面上開始的地方。我已經讀過一間使用雙倍長度類型的商店,並且第7和第8列對齊了摺疊式紙張的向內和向外穿孔。好戲 - 我不知道它有多普遍。

在任何情況下,托架控制字符都可能是與該語言強烈關聯的慣例,但它們是硬件特性而不是語言特性。事實上,沒有特別的保證,「1」將進入頁首,除了大多數(如果不是所有的)商店恰好設置他們的車廂控制磁帶這一事實。

1

是的,Fortran編譯器仍支持Fortran托架控件,但通常默認情況下它是禁用的。例如,在英特爾Fortran中,需要使用非標準(但廣泛實施)的CARRIAGECONTROL ='FORTRAN'選項打開文件。看看gfortran是否有類似的東西。這就是說,我不會推薦使用這種約定來編寫新的應用程序,因爲它可能無法在所有輸出設備上以您想要的方式工作。

相關問題