在FORTRAN中,没有参数的FMT有什么用?

In FORTRAN, what is the use of FMT without parameters?

提问人:user3184199 提问时间:6/14/2022 最后编辑:vitautuser3184199 更新时间:6/14/2022 访问量:94

问:

我检查了一个旧的 FORTRAN 77 程序。
它有一个 FMT 字符数组,比如说:

CHARACTER*4 FMT(4)

它得到了一些元素,例如:

/'9,','1X','A','0'/ ...etc...  

在执行过程中,FMT 元素可能会获得不同的值 例如:

FMT(4) = '3x'

我很困惑,因为WRITE语句是这样的

WRITE (xOUT,FMT) 'Result: ',(trek(j),j=1,Nev)

FMT 是一个数组。右?不是字符串。
那么 WRITE 究竟会从 FMT 读取什么格式呢?
非常感谢任何帮助。

数组 IO Fortran

评论


答:

2赞 francescalus 6/14/2022 #1

该变量是一个字符数组。当数组用作输入/输出语句的格式时,它被视为 (Fortran 2018, 13.2.2 p3) 每个元素都被指定和连接。所以在这种情况下FMT

write(xOUT,FMT) ...

被解释为

write(xOUT,FMT(1)//FMT(2)//FMT(3)//FMT(4)) ...

这很不幸,因为必须有一个作为它的第一个非空白字符。FMT(1)(

在字符编辑描述符之外,格式中的空白并不重要。


虽然这最初看起来很奇怪,但却是创建动态格式的便捷方法。考虑一个极端的例子,我们想编写一个字符串用作格式,它可以是 或 。(I5.5)(F26.14)

这可能是:

character(6) fmt(3)
fmt(1) = '('
fmt(3) = ')'

if (something) then
  fmt(2) = 'I5.5'
  print fmt, 113
else
  fmt(2) = 'F26.14'
  print fmt, 123.56
end if

(是的,我希望你不会这样做,但人们可以很容易地将其扩展到它看起来确实有吸引力的情况。

character(8) fmt
fmt = '(      )'

if (something) then
  fmt(2:7) = 'I5.5'
  print fmt, 113
else
  fmt(2:7) = 'F26.14'
  print fmt, 123.56
end if

看看作者试图避免什么。

评论

0赞 user3184199 6/14/2022
好的,所以它获取 FMT 数组的元素,将它们连接起来并创建一个 FORMAT 字符串。但在这种情况下,这听起来很荒谬,因为 FMT 阵列有 30 个元素......字符*4 FMT(30) 它不应该(以某种方式)选择要包含哪些元素吗?或者我没有得到“在角色编辑之外......”部分
0赞 francescalus 6/14/2022
你在问题中说。对于任何数组,它都是所有元素(4 或 30),别无选择。第一个和最后一个之后的任何空白都将被忽略,数组内的大多数空白也将被忽略。CHARACTER*4 FMT(4)()
0赞 francescalus 6/14/2022
如果你能用有效的格式展示一个完整的数组操作示例(参见最小可重复的例子),我可以添加工作的细节。
0赞 user3184199 6/14/2022
该程序是 1000 多行代码。有几个子程序和几个 FMT(n) ='something'。我试图在这里简化问题,以防我能更好地理解它。这就是为什么我提到 4 个元素 FMT(4) 而不是 (30)。例如,在特定的 WRITE 指令之前,它只更改 FMT(3)、FMT(4) 和 FMT(6),然后更改 WRITE(xOUT, FMT)。我会把这个话题留几天,以防有人甚至我想出一些东西,如果没有,我会标记@francescalus答案被接受。