2017-12-08 3 views
0

Für "geschmackvolle" Ausgabe während der Iterationsprozedur möchte ich folgenden Ansatz (ich sah es für ein Programm in C++ geschrieben) in Fortran. Jede neue Iteration gibt mir die Zeile in der Konsole mit entsprechenden Informationen:Die Verwendung von Backspace-Zeichen (char (8)) in Fortran

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

ich jede neue Linie will die vorherigen (dh Labels „Iteration“ „Genauigkeit“ ... etc. bleibt unverändert zu ersetzen, während Werte ändern sich).

Ich habe versucht, verschiedene Varianten einschließlich

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

Natürlich geben erste zwei Zeilen einen Laufzeitfehler und die letzt nichts gibt.

Wie kann ich einen solchen Ansatz implementieren?

+0

Wie @francescalus richtig angemerkt, ist die Lösung auf Referenzlink gegeben. Aber das Einfachste ist nicht das Gewählte. Der von @tony Rollett angegebene ist praktischer. 'write (Einheit, '(A, i, A \)') char (13) // 'Iteration', iter, 'Accuracy', accur '. – MuKeP

Antwort

1

Es ist vielleicht ein bisschen ziemlich komplizierte Lösung, aber eine Option würde die ncurses Bibliothek benutzen - http://genepi.qimr.edu.au/staff/davidD/

Nachfolgend finden Sie eine Änderung des Programms testcurs.f90 zum Herunterladen von der verlinkten Seite. Es zeigt nur eine Fortschrittsnachricht an, die progressiv aktualisiert wird. Um es zu testen, müssen Sie auch die ncurses.f90 Modul und verknüpfen Sie dann mit -lncurses, dh

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

Das Beispiel (zeigt nur das Programm selbst, testcurs.f90 enthält auch die Definition von initTest usw.):

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 
Verwandte Themen