9

科学者とエンジニアのためのFortran95/ 2003の本では、フォーマットステートメントの最初の列が制御文字用に予約されていることを認識することの重要性について多くの話があります。インターネットでキャリッジ制御と呼ばれる制御文字も見ました。

混乱を避けるために、制御文字では、文字「1、空白(つまり、\ s)、0、および+」を、の最初の列(文字)に配置したときに出力の垂直方向の間隔に影響を与えるものとして参照します。 FORMATステートメント。

また、完全に固定幅の書体で書かれたこのテキストのみのWebページを参照してください:Fortranキャリッジ制御(等幅フォントの散文ほど正確さと古さを叫ぶものはないため)。私はこのページとそれが好きな他の人たちがはっきりしていないことに気づきました。

科学者およびエンジニア向けのFortran95/2003によると、最初の列がキャリッジ制御用に予約されていることを思い出せないと、意図しない恐ろしい出力が発生する可能性があります。デーブ・バリーを言い換えると、間違った文字を入力すると、ノルウェーで核ミサイルが発射されます。

しかし、この厳しい警告に固執しようとすると、gfortranは私が何について話しているのかわからないことがわかります。

いくつかのサンプルコードで私のポイントを説明させてください。円周率を印刷しようとしています。

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

過去数年間、この最初の列の使用を無視すると、ページが排出されるなど、ライン プリンターに問題が発生する可能性がありましたが、最後にライン プリンターを見たのはいつですか? それ以外の場合は、出力デバイス、コンパイラ、および OS に依存していました。「科学者と技術者のための Fortran 95/2003」のアドバイスは、約 15 ~ 20 年前には優れていました。端末、ポストスクリプト、その他の最新のプリンターでは、列 1 はもはや特別なものではありません。列 1 にはもう特に注意を払っていませんし、トラブルにも巻き込まれていません。

Fortran 2003 標準では、紙送り制御が削除済みとしてリストされていますが、これは Fortran 言語標準ではめったに行われないことです。「Fortran 95/2003 の説明」の 359 ページまたは「Fortran 2003 ハンドブック」の 326 ページを参照してください。おそらく、gfortran で -std=f2003 または -std=f2008 を選択すると、列 1 がキャリッジ コントロールとして使用されないことが保証されるため、「悪いこと」は完全に不可能になります。

于 2010-07-21T06:08:26.283 に答える
2

一般的なプリンターハードウェアは、列 1 の内容に基づいて特別なことを行います。ライン プリンターには、前後に動くプリント ヘッドがないことに注意してください。バッファ。ハンマーの前の文字がバッファ内の文字と一致すると、ハンマーが通電され、バッファのそのバイトが空白になります。バッファ全体が空白になると、プリンタは次の行をロードします。

プリンタには、キャリッジ リターン、ライン フィード、またはフォーム フィード制御文字の概念がありませんでした。代わりに、バッファの最初の文字を使用して、各行を印刷する前に紙が何をすべきかを示しました。特定のコードは、用紙を固定量だけ進めます。他のコードは、紙テープ リーダーの (IIRC) 8 列の 1 つを選択し、適切な列に穴が見つかるまで、印刷用紙と紙テープを一緒に進めます。従来、紙テープは印刷されたページと同じ長さのループで、列 1 には 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 に答える