我希望将Fortran写入语句格式化为依赖于某个变量。例如,我可以写:
write(*,'(3f15.3,3f9.2)') x,y,z,(var(i),i=1,nvari)
其中nvari = 3
。但是,如果在某些情况下,我实际上有4个变量(即nvari = 4
)。我想写这样的东西:
write(*,'(3f15.3,nvari(f9.2))') x,y,z,(var(i),i=1,nvari)
现在,nvari
可以是任何内容,输出将按我喜欢的方式工作。我怎样才能做出像这样的工作?
答案 0 :(得分:16)
如果您使用的是英特尔Fortran,它有一个专有扩展名 - 您可以在尖括号中包含一个现有变量作为说明符:
write(*,'(3f15.3,<nvari>f9.2)') x,y,z,(var(i),i=1,nvari)
答案 1 :(得分:13)
如果您的编译器支持它,'(3f15.3, *(f9.2))'
如果你有一个较旧的编译器,只需使用一个比你要输出的项目更大的数字,例如'(3f15.3, 999(f9.2))'
。您不必使用该格式。
对于最复杂的情况,您可以将格式写入字符串并将其用作格式:
write (string, '( "(3f15.3, ", I4, "(f9.2))" )' ) nvari
write (*, string ) x,y,z, (array(i), i=1,nvari)
通过对格式的理解,包括格式恢复,很少需要使用字符串格式。
答案 2 :(得分:11)
不是直接在write语句中编写格式,也可以使用字符变量。
character(len=32) :: my_fmt
my_fmt = '(3f15.3,3f9.2)'
write(*, my_fmt) x, y, z, (var(i), i = 1, nvari)
现在可以在write语句之前操作字符变量以包含所需的重复计数,使用所谓的内部写入或写入内部文件。
write(my_fmt, '(a, i0, a)') '(3f15.3,', nvari, 'f9.2)'
(只需确保声明的my_fmt
长度足以包含整个字符串。)
答案 3 :(得分:4)
你想写这样的东西:
write(*,'(3f15.3,nvari(f9.2))') x, y, z, (var(i), i=1,nvari)
事实上,Fortran标准中有一个老技巧,可以省略nvari
,因此:
write(*,'(3f15.3,(f9.2))') x, y, z, (var(i), i=1,nvari)
甚至是这样:
write(*,'(3f15.3,f9.2)') x, y, z, (var(i), i=1,nvari)
标准表示格式中的最后一个描述符是为了容纳列表中的所有变量而经常隐式重复的。可以对“最后一个描述符”进行括号,以便隐式重复描述符的最后一个组,例如:
write(*,'(3f15.3,(2x,f9.2))') x, y, z, (var(i), i=1,nvari)