【问题标题】:Format string for output dependent on a variable取决于变量的输出格式字符串
【发布时间】:2012-04-10 11:47:36
【问题描述】:

我希望将 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 可以是任何东西,并且输出将按照我的喜好工作。我怎样才能做出这样的事情?

【问题讨论】:

  • 34 唯一的选择吗?还是您正在寻找可以处理任何数字的东西?
  • OP 指定'nvari 可以是任何东西'。

标签: formatting fortran fortran90 intel-fortran


【解决方案1】:

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

  write(*,'(3f15.3,<nvari>f9.2)') x,y,z,(var(i),i=1,nvari)

【讨论】:

  • 哦,酷。谢谢你的回答。这正是我想要的。
  • 有没有办法在&lt;nvari&gt; 上做一些数学运算?例如 - &lt;nvari&gt;+2, or 3*&lt;nvari&gt; or &lt;nvari&gt;**2 在格式声明中?我用括号试过了..没用!编辑:我现在使用的解决方法是定义另一个整数变量 nfmt 并使用它而不是 nvari
  • 有没有办法使用 gfortran 编译器使用A&lt;my_int&gt; 样式格式?
  • 如果您来寻找解决方案,请参阅其他答案,此答案不适用于 gfortran 和其他一些编译器。
  • 这帮助我意识到我拥有的 FORMAT 语句中的 是什么。但现在我必须切换编译器:(
【解决方案2】:

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

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

【讨论】:

  • 酷。谢谢。我正在使用 Intel Fortran 编译器,我认为它是最近的。但无论如何,它不会执行 '(3f15.3, *(f9.2))',所以我使用的是第二种解决方案。顺便说一句,“格式还原”是什么意思?我做了一些谷歌搜索,但没有想出太多。
【解决方案3】:

除了直接在 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 的声明长度足够长,可以包含整个字符串。)

【讨论】:

  • 或者,在最后一个(括号)语句中,使用可分配长度的字符变量。
  • @HighPerformanceMark:当然,如果你的编译器支持它,那将是最好的解决方案。
  • 对于那些使用 gfortran 编译器的人,这个解决方案是 gfortran 文档中推荐的解决方案。请参阅文档中的“变量 FORMAT 表达式”(gfortran 4、gfortran 5 的第 6.2.3 节;gfortran 6 的第 6.2.2 节)。
  • 我警告不要写入字符串。 Mac 上的 Gfortran 对于写入字符串变量不是线程安全的。文件的 I/O 似乎是线程安全的,而不是字符串。
【解决方案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)

该标准规定,格式中的最后一个描述符会根据需要尽可能频繁地隐式重复,以容纳列表中的所有变量。 “最后一个描述符”可以用括号括起来,这样最后一个 group 描述符就会隐式重复,例如:

write(*,'(3f15.3,(2x,f9.2))') x, y, z, (var(i), i=1,nvari)

【讨论】:

  • 我正在使用gfortran9。除非我在第二个示例中使用括号,否则这对我不起作用。它还在新行而不是在同一行上产生重复输出,这不是 OP 想要的。
猜你喜欢
  • 2023-01-19
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
  • 2011-06-17
  • 2019-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多