8

DOループで行った計算の進行状況をコンソール画面に表示したい。次のように、進行状況変数を端末に出力できます。

PROGRAM TextOverWrite_WithLoop
IMPLICIT NONE
INTEGER :: Number, Maximum = 10
 DO Number = 1, MAXIMUM   
  WRITE(*, 100, ADVANCE='NO') REAL(Number)/REAL(Maximum)*100     
  100 FORMAT(TL10, F10.2)
  ! Calcultations on Number     
 END DO    
END PROGRAM TextOverWrite_WithLoop

コンソール画面での上記のコードの出力は次のとおりです。

10.00 20.00 30.00 40.00 50.00 60.00 70.00 80.00 90.00 100.00

すべてが同じ行にあり、コンソール ウィンドウによってのみラップされます。

ADVANCE='No'引数とTL10 (タブが非常に多くのスペースを残した) 編集記述子は、同じ行のテキストを上書きするのにうまく機能します。たとえば、次のコードの出力です。

WRITE(*, 100, ADVANCE='NO') 100, 500
100 FORMAT(I3, 1X, TL4, I3)

は:

500

それ以外の:

100 500

TL4 編集記述子のためです。

これら 2 つの例から、WRITE ステートメントは、別の WRITE ステートメントによって、または同じ WRITE ステートメントの前の実行 (DO ループなど) によって書き込まれたものを上書きできないと結論付けることができます。

これはどうにか克服できるでしょうか?

Windows 7 RC1 で FTN95 コンパイラを使用しています。(G95 コンパイラのセットアップ プログラムは Windows 7 RC1 をブルースクリーンしますが、Vista では問題なく動作します。)

Fortran 95 書き込みステートメントで改行を抑制するという質問については知っていますが、その質問に対する答えは、同じ行の前の出力に新しい出力が追加されることを意味するため、私にはうまくいきません。新しい出力が以前の出力を上書きする代わりに。

前もって感謝します。

4

4 に答える 4

14

ACHAR(13)以下は、 を使用してキャリッジ リターンをエンコードすることにより、システム間で移植可能にする必要があります。

          character*1 creturn
    !   CODE::
          creturn = achar(13)  !  generate carriage return
    !   other code ...
          WRITE( * , 101 , ADVANCE='NO' ) creturn , i , npoint
101     FORMAT( a , 'Point number : ',i7,' out of a total of ',i7)
于 2009-12-12T16:10:40.317 に答える
3

Fortran 標準の範囲内では、この問題に対する解決策はありません。ただし、コンパイラが Fortran 文字列のバックスラッシュを理解できる場合 (GNU Fortran はオプション を使用すると理解できます-fbackslash)、次のように記述できます。

  write (*,"(A)",advance="no") "foo"
  call sleep(1)
  write (*,"(A)",advance="no") "\b\b\bbar"
  call sleep(1)
  write (*,"(A)",advance="no") "\b\b\bgee"
  call sleep(1)
  write (*,*)
  end

これは、バックスラッシュ文字 ( \b) を使用して、その行に以前に書き込まれた文字を消去します。

注意: コンパイラが を理解しない場合は、フォーマット文字列で指定子advance="no"を使用するなど、関連する非標準のトリックを使用できます。$

于 2009-09-08T15:18:31.147 に答える
1

以下は、g95 fortran を使用して完全に機能しました。

      NF = NF + 1
      IF(MOD(NF,5).EQ.0) WRITE(6,42,ADVANCE='NO') NF, ' PDFs'//CHAR(13)
  42  FORMAT(I6,A)

与えた:5つのPDF

同じ行の #1 の位置にカーソルを置きます。次の更新で、5 は 10 に変わりました。ASCII 13 (10 進数) はキャリッジ リターンです。

于 2015-04-10T17:44:36.870 に答える
-3
OPEN(6,CARRIAGECONTROL ='FORTRAN')
DO I=1,5
WRITE(6,'(1H+" ",I)') I
ENDDO
于 2010-03-02T06:53:15.357 に答える