Fortran格式描述符的问题。

3

我正在学习Fortran,在使用格式化输出时发现一些奇怪的问题(我正在使用Fortran onlinegdb)

Program Hello
real, dimension(3,2):: array
array = 0
write(*, '(A,/, A,/, F5.2, F5.2)') &
"1","2",((array(i, j), i = 1,3), j = 1,2)
End Program Hello

I expected

1
2
0.00 0.00
0.00 0.00
0.00 0.00

我理解

1
2
0.00 0.00

0.00 0.00

有什么问题吗?


欢迎,我建议参加[导览]。 - Vladimir F Героям слава
2个回答

2
弗拉基米尔F先生说得,给出的格式不适用于提供的输出项:在写入两个实数后进行格式翻转时,控制返回到查看编辑描述符A,但与之对应的不是另一个字符变量。这是不允许的。
然而,在其他答案的早期修订中建议的格式也不能给出您所期望的输出。如果您想在每行上写入一对数字,并依赖于无限重复规范,则需要将文件定位明确放入格式中:
write(*, '(2(A,/),*(2F5.2,:,/))') "1", "2", transpose(array)

如果最后没有 / 的编辑,那么repeat将意味着数组的所有元素都进入同一条记录。我们还在那里使用了 :,以便在最后一个数组元素后 不会有额外的换行符
(我还将输出数组进行了 transpose,因为那可能是您真正想要的。原始输出中的隐含 do 循环有点出乎意料,并且移动最终索引更加合理。)
如答案的纠正形式所示,带有有限重复规范的格式回退确实意味着定位:
write(*, '(2(A,/), 2(F5.2))') "1","2", transpose(array)

处理完格式反转2(F5.2)后,仍有元素要写出时会被重复使用。
总之,如果您依赖于格式反转来“跳过”格式的早期部分同时保留新记录,则必须使用括号正确标记要恢复到整个格式的部分。如果只是用括号将整个格式包围而没有其他格式,则格式反转会重复使用整个格式。

2
您请求打印两个字符串,每个字符串单独成行,然后是两个浮点数。这部分操作执行正确。
但是数组中仍有剩余项。格式解释器从新的一行重新开始,再次处理两个字符串和两个数字。但是该数组不包含任何字符串...
请尝试使用'(A,/, A,/, (F5.2, F5.2))'。这将重复两次浮点数格式组,直到还有需要处理的数字,但这次格式不会返回到开头。(注意:答案的旧版本未经测试,其中包含了额外的重复计数 - 我没有意识到这会禁用格式恢复。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接