16

私のプログラムは計算の状態を端末に出力し、かなりの情報を含んでいます。可能であれば、テキストの一部を色分けしたいと思います。

このサイトのスレッドを参照して、BashとC++でどのように実行できるかを見てきました。しかし、Fortran(モダン)で同じ結果を達成するためにそれを使用することはできませんでした。たとえば、私はこのサンプルコードを試しましたが、これは機能するはずです。

PROGRAM test
    PRINT*, 'A great color is \033[95m pink \033[0m.'
END PROGRAM test

ピンクがピンク色になっている「素晴らしい色はピンク」という出力になると思っていました。代わりに、「素晴らしい色は\033[95mピンク\033[0m」です。」と表示されます。何が欠けているのかわかりません。

コードの印刷行を次のように置き換えると、CALL EXECUTE_COMMAND_LINE("echo'素晴らしい色は\033[95mピンク\033[0m。'"))、希望どおりの出力が得られます。ただし、コードからエコーを呼び出し続けたくありません。色付きの出力を取得する方法はありますか?

ありがとう!

4

4 に答える 4

19

'\ 033'としてのエスケープ文字表現は、機能していないようです。確認するのに便利なFortranはありませんが、char変換関数を呼び出してcスタイルのエスケープの代わりに文字を明示的に使用してみてください。つまり、呼び出して実際の文字をchar(27)作成し、正しい場所で出力文字列に組み込みます。 。

于 2011-06-19T14:15:53.920 に答える
6

これは一種の古い質問ですが、誰かが後で(私がしたように)これに対する答えを探しに来た場合に備えて、私は自分の答えを投げ入れると思いました。

エスケープシーケンスを機能させようとして、あなたと同じような問題が発生しました。結局、gfortranのmanページに移動しました。'escape'を検索すると、コンパイラオプション'-fbackslash'が表示されます。マニュアルページから:

文字列リテラルのバックスラッシュの解釈を、単一のバックスラッシュ文字から「Cスタイル」のエスケープ文字に変更します。次の組み合わせは、「\ a」、「\ b」、「\ f」、「\ n」、「\ r」、「\ t」、「\ v」、「\」、および「\0」に展開されます。 ASCII文字は、それぞれアラート、バックスペース、フォームフィード、改行、キャリッジリターン、水平タブ、垂直タブ、バックスラッシュ、およびNULです。さらに、 "\ x" nn、 "\ u" nnnn、および "\ U" nnnnnnnn(各nは16進数)は、指定されたコードポイントに対応するUnicode文字に変換されます。\で始まる文字の他のすべての組み合わせは、展開されません。

したがって、エスケープシーケンスをFortranで機能させるには、このオプションを使用してコンパイルするだけです。異なる点の1つは、8進数の代わりにxとともに16進数を使用する必要があることです。この特定のケースでは、代わりに\033を使用します\x1B。たとえば、PRINT *, "\x1B[31mThis text is red.\x1B[0m一部のテキストを赤で印刷します。

この方法は、色を使用するたびに個別に定義された文字の束を連結するよりも間違いなく好ましいと思います。

于 2013-11-25T04:45:54.617 に答える
6

ifortを使用してコンパイルする場合は、「-assume bscc」を使用してコンパイルする必要があります。その場合にのみ、次を使用できます。

PRINT*, 'A great color is \033[95m pink \033[0m.'

コードは次のとおりです。

[90m=dark grey           [30m=black
[91m=peach               [31m=red
[92m=light green         [32m=green
[93m=light yellow        [33m=yellow
[94m=light blue          [34m=blue
[95m=pink                [35m=purple
[96m=light aqua          [36m=aqua
[97m=pearl white
于 2014-09-18T16:07:50.800 に答える
4

私はちょうどあなたが望むことを正確に実行しているように見えるファウルモジュール/ライブラリに出くわしました。私はまだそれを使用していませんが、Fortranプログラムからのターミナル出力をフォーマットしておくと非常に便利になるので、すぐに試してみる予定です。

于 2011-12-17T12:27:46.710 に答える