2017-12-08 30 views
0

반복 절차 중에 "flavorful"출력을 얻으려면 Fortran에서 다음과 같은 방법으로 C++로 작성된 일부 프로그램을 사용하고 싶습니다. Fortran에서 백 스페이스 문자 (char (8)) 사용

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

내가 (즉, 라벨 등 "반복", "정확도"... 동안 변경되지 이전을 대체 할 때마다 새로운 라인을 원하는 : 모든 새로운 반복이 나에게 해당 정보를 사용하여 콘솔의 라인을 제공합니다 값이 변경됨). 물론

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

포함

내가 노력 다른 변종, 처음 두 줄은 런타임 오류를주고 마지막으로는 아무것도주지 않는다.

어떻게 이러한 접근 방식을 구현할 수 있습니까?

+0

@francescalus가 올바르게 지적한대로 해결책은 참조 링크에 있습니다. 그러나 가장 단순한 것은 선택한 것이 아닙니다. @tony rollett에 의해 주어진 것이 더 편리합니다. 'write (unit, '(A, i, A \)') char (13) // '반복', iter, '정확도', '정확함'. – MuKeP

답변

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