ztl*_*ztl 1 fortran indentation fortran90
在程序中有许多嵌套子程序Fortran 90,我想将这些嵌套级别打印到压缩长度与级别成比例的文件中(即嵌套子程序中打印的信息比调用子程序具有更高的缩进).将写入包括不同数据类型的其他信息(字符串,整数,...).
我想到了不同的方法(在这个例子中,lev是级别,只是在循环中构建,但在每个子例程中以其他方式更新):
Program adaptIndent
INTEGER :: lev
CHARACTER (LEN=*), PARAMETER :: fmt1 = '(I1,'': ''A)'
CHARACTER (LEN=*), PARAMETER :: fmt2 = '(I2,'': ''A)'
DO lev=1,10
CALL printindent1
!CALL printindent2
!CALL printindent3
ENDDO
CONTAINS
SUBROUTINE printindent1 !convert everything (incl. indent and lev) to CHAR
CHARACTER(LEN=lev) :: indent
CHARACTER(LEN=2) :: strlev
WRITE(indent, '(A)') ' '
WRITE(strlev, '(I2)') lev
WRITE(*, '(A)') indent//TRIM(ADJUSTL(strlev))//': this is my level'
END SUBROUTINE printindent1
SUBROUTINE printindent2 !build a new format defining the indentation
CHARACTER(LEN=2) :: strlev
CHARACTER(LEN=20) :: fmtlev
WRITE(strlev, '(I2)') lev
WRITE(fmtlev, '(A)') '('//TRIM(ADJUSTL(strlev))//'X, A)'
WRITE(*, fmtlev) TRIM(ADJUSTL(strlev))//': this is my level'
END SUBROUTINE printindent2
SUBROUTINE printindent3 !add indent as CHAR to an existing format
CHARACTER(LEN=lev) :: indent
WRITE(indent, '(A)') ' '
IF(lev.LT.10) THEN
WRITE(*, fmt1(1:1)//'A,'//fmt1(2:)) indent, lev, 'this is my level'
ELSE
WRITE(*, fmt2(1:1)//'A,'//fmt2(2:)) indent, lev, 'this is my level'
ENDIF
END SUBROUTINE printindent3
END Program adaptIndent
Run Code Online (Sandbox Code Playgroud)
(期望的)输出对于这些解决方案是相同的:
1: this is my level
2: this is my level
3: this is my level
4: this is my level
5: this is my level
6: this is my level
7: this is my level
8: this is my level
9: this is my level
10: this is my level
Run Code Online (Sandbox Code Playgroud)
我的问题是,每次我做有用的WRITE(*, *fmt*),我需要初步(和丑陋)步骤来做到这一点:
有没有比上面的许多步骤更优雅的解决方案呢?
你可以使用内在的 REPEAT
并写下类似的东西:
write(*,"(A,I0,A)")repeat(" ",lev),lev, str
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
252 次 |
| 最近记录: |