You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fortran子例程中进度条重复打印问题求助

Fortran进度条子例程重复输出问题解决

问题原因

  1. 多余换行输出:子例程中的write(*, *)和末尾的write(*, *) ""会输出换行符,导致每次调用进度条都在新行显示,无法通过char(13)(回车符)覆盖原有内容。
  2. 重复初始提示:子例程开头的write(*, '(a17)', advance='no') ' Progress : 00.0%'每次调用都会执行,造成重复输出。
  3. 进度计算异常:循环中progress = i / real(atomCount - 1)会导致最后一次进度超过100%(当i=atomCount时,值为atomCount/(atomCount-1)),可能引发显示异常。

解决办法及修改后的代码

修改后的进度条子例程

subroutine print_progress_bar(progress) 
implicit none
    real, intent(in) :: progress
    integer :: PBWIDTH = 60
    character(len=60) :: PBSTR = "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
    character(len=60) :: CTPBSTR
    integer :: lpad
    
    ! 计算进度条填充长度
    lpad = int(progress * (PBWIDTH + 1))
    CTPBSTR = PBSTR(1:lpad)
    CTPBSTR(lpad + 1: PBWIDTH) = ' '
    
    ! 回到行首,覆盖原有内容
    write(*,'(a, a, f5.1, a1, a1, a, a, a)', advance="no") & 
          char(13), ' progress: ', progress*100, '%', '[', CTPBSTR, ']'
    
    flush(6)  ! 强制刷新输出缓冲区

end subroutine print_progress_bar

修改后的调用循环

progress = 0.00

! 先输出初始进度条框架(只执行一次)
write(*, '(a, a, f5.1, a1, a1, a, a, a)', advance="no") &
      ' progress: ', 0.0, '%', '[', repeat(' ', 60), ']'
flush(6)

do i = 1, atomCount 
    call print_progress_bar(progress)
    ! 修正进度计算,确保进度范围在0~1之间
    progress = real(i) / real(atomCount)
end do

! 循环结束后换行,避免后续输出和进度条重叠
write(*, *) ""

关键修改说明

  • 移除了所有输出换行的语句,确保所有进度条内容都在同一行更新。
  • 将初始进度框架的输出移到循环外,只执行一次,避免重复输出。
  • 修正了进度计算逻辑,progress = real(i)/real(atomCount)保证最后一次循环进度刚好为100%。
  • 合并了多个write语句,减少IO操作,同时确保所有输出都使用advance='no',配合char(13)实现行首覆盖。

内容的提问来源于stack exchange,提问作者Stochastic Cactus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 07:35:36