代码不完全规范,如果您的编译器无法编译,您可以试试注释中的替代写法。如果您的编译器较老,可能无法编译。
效果如图:
Module CMD_Progress Implicit None private Logical , parameter , public :: CMD_PROGRESS_ABSOLUTE = .true. Type , public :: CLS_CMD_Progress Integer , private :: N = 100 , lens = 25 , i = 0 Character :: M = "*" , O = "." Character(len=64) :: Prefix = " Progress: " Contains Procedure :: Set Procedure :: Put End Type CLS_CMD_Progress contains Subroutine Set( this , N , L ) Class( CLS_CMD_Progress ) :: this Integer , Intent( IN ) :: N , L this%N = N this%lens = L this%i = 0 End Subroutine Set Subroutine Put( this , K , bAbsol ) Class( CLS_CMD_Progress ) :: this Integer , Intent( IN ) :: K Logical , Intent( IN ) , optional :: bAbsol character :: br integer :: jm this%i = this%i + K if ( present( bAbsol ) ) this%i = merge( k , this%i+K , bAbsol ) this%i = min(this%i,this%n) jm = Nint( real( this%i * this%lens ) / real( this%N ) ) br = merge( char(13) , char(10) , this%i < this%n ) write( * , '(a,"[",2a,"]",f6.2,"%",a\)') trim(this%Prefix) , & repeat(this%M , jm ) , repeat( this%O , this%lens-jm ) , this%i*100.0/this%N , br End Subroutine Put End Module CMD_Progress Program www_fcode_cn use CMD_Progress Implicit None type( CLS_CMD_Progress ) ::Progress integer :: i call Progress%Set( N = 1700 , L = 35 )!// 1700次,显示长度25 Progress%Prefix = "Test Progress: " !// 前方提示文字,不是必须 Progress%M = "%" !// 已完成部分的字符,不是必须 Progress%O = "-" !// 未完成部分的字符,不是必须 write(*,*) 'Begin' Do i = 0 , 1700 , 50 call Progress%Put( i , CMD_PROGRESS_ABSOLUTE ) !// 绝对方式 !call Progress % Put( 50 ) !// 也可用相对方式 call sleep(1) !// 如您的编译器不支持,请用下方的循环代替 !Do j = 1 , 10000000 !End Do End Do write(*,*) 'End' End Program www_fcode_cn