2017-12-08 9 views
0

反復手続き中に "風味豊かな"出力が得られるように、私はFortranで次のアプローチを使用しました(C++で書かれたいくつかのプログラムで見ました)。 すべての新しい反復が私に対応する情報とのコンソールで行を与える:Fortranでのバックスペース文字(char(8))の使用

Iteration XX Accuracy X.XXXXE-XX Time spent XX seconds 

私は前のもの(すなわち、ラベル「反復」「精度」を置き換えるために、すべての新しい行をしたい...などは変更されないまま、しばらく値が変化する)。私はもちろん

backspace(6) 
backspace(0) 
write (*,*) char(8)//'Accuracy ...' 

など、さまざまなバリエーションを試してみました

、最初の2行は、実行時エラーを与え、最後には何も与えません。

どうすればこのようなアプローチを実装できますか?

+0

@francescalusが正しく記述しているように、解決策は参考リンクに記載されています。しかし、最も簡単なものは選択されたものではありません。 @tony rollettによって与えられたものはより便利です。 '(A、i、A \)')char(13)// '反復'、iter、 '精度'、正確。 – MuKeP

答えて

1

それはおそらく、少し複雑なソリューションですが、1つのオプションncursesライブラリを使用することです - http://genepi.qimr.edu.au/staff/davidD/以下

は、リンク先のページからダウンロードできるプログラムtestcurs.f90の変形例です。プログレッシブに更新されている進捗メッセージが表示されます。それをテストするために、あなたもncurses.f90モジュールが必要になりますし、その後

gfortran -c ncurses.f95 
gfortran -o test testcurs.f95 -lncurses 

例、すなわち、-lncursesとリンク(単にプログラム自体を示し、testcurs.f90initTestなどの定義も含まれています):

program testcurses 
    use curses 
    use commands 
    type (C_PTR) :: iwin = C_NULL_PTR 
    integer (C_INT) :: key 
    integer :: istat, new_option=1, old_option=0 
    CHARACTER(LEN=1024) :: msg 

    call initTest(iwin, istat) 

    if (istat /= 0) then 
    write(*,'(a)') 'ERROR: initscr failed!' 
    stop 
    end if 

    ierr = wbkgd(iwin, curses_a_reverse) 
    ierr = erase() 
    ierr = attrset(curses_a_bold) 
    DO i = 10, 100, 10 
    WRITE(msg, '(''Progress '', I0, ''%'')') i 

    ierr = mvaddstr(20, 20, TRIM(msg) // C_NULL_CHAR) 
    ierr = refresh() 
    CALL SLEEP(1) 
    END DO 
    key = getch() 

    ierr = delwin(iwin) 
    ierr = endwin() 
end program testcurses 
関連する問題