16

我希望将 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可以是任何东西,输出将按我喜欢的方式工作。我怎样才能使这样的工作?

4

4 回答 4

18

如果您使用的是 Intel fortran,它对此有一个专有扩展——您可以在尖括号中包含一个现有变量作为说明符:

  write(*,'(3f15.3,<nvari>f9.2)') x,y,z,(var(i),i=1,nvari)
于 2012-04-12T13:26:34.830 回答
15

如果你的编译器支持它,'(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)

随着对格式(包括格式反转)的理解,很少需要使用字符串格式。

于 2012-03-26T23:26:35.813 回答
13

除了直接在 write 语句中写入格式,还可以使用字符变量。

character(len=32) :: my_fmt
my_fmt = '(3f15.3,3f9.2)'
write(*, my_fmt) x, y, z, (var(i), i = 1, nvari)

现在可以使用所谓的内部写入或写入内部文件来操作字符变量以在写入语句之前包含所需的重复计数。

write(my_fmt, '(a, i0, a)') '(3f15.3,', nvari, 'f9.2)'

(只需确保声明的长度my_fmt足以包含整个字符串。)

于 2012-03-26T23:27:27.403 回答
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)
于 2012-09-20T16:53:21.267 回答