Fortran 格式描述符的问题
Problems with format descriptors in Fortran
我正在学习 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
我预计
1
2
0.00 0.00
0.00 0.00
0.00 0.00
我明白了
1
2
0.00 0.00
0.00 0.00
怎么了?
您请求打印两个字符串,每个都在一个新行上,然后是两个浮点数。这是正确的。
但是数组中仍然有剩余的项目。格式解释再次从新行开始,并再次为两个字符串和两个数字。但是数组不包含任何字符串...
试试 '(A,/, A,/, (F5.2, F5.2))'
。那会重复两次浮点数格式组,直到还有数字要处理,但是这次格式不会return到最开始。 (注意:答案的旧版本和未经测试的版本具有额外的重复计数 - 我没有意识到这会禁用格式还原。)
Vladimir F 说给定的格式不适合为输出提供的项目:在写入两个实际值后进行格式转换,控制返回到查看编辑描述符A
但与之对应的不是另一个字符变量。这是不允许的。
但是,该答案的较早版本中建议的格式也没有提供您期望的输出。如果你想在每一行上写成对的数字依赖于无限重复规范,你需要明确地将文件定位放入格式中:
write(*, '(2(A,/),*(2F5.2,:,/))') "1", "2", transpose(array)
如果最后没有 /
编辑,重复将意味着数组的所有元素都在同一条记录中。我们在那里也有 :
,所以我们在最后一个数组元素之后 。
(我也 transpose
d 输出数组,因为这可能是你真正的意思。原始输出中隐含的 do 循环有点出乎意料,首先移动最终索引更有意义.)
对于有限的重复规范,如该答案的更正形式所示,格式反转确实意味着定位:
write(*, '(2(A,/), 2(F5.2))') "1","2", transpose(array)
处理完 2(F5.2)
后,在仍有元素要写出的情况下,回退已重用此内容。
总而言之,如果您依靠格式还原来“跳过”格式的较早部分同时保留新记录,则必须正确标记整个格式的部分以还原为使用括号。只有整个格式都被括号包围,没有其他格式,格式还原会重用整个格式。
我正在学习 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
我预计
1
2
0.00 0.00
0.00 0.00
0.00 0.00
我明白了
1
2
0.00 0.00
0.00 0.00
怎么了?
您请求打印两个字符串,每个都在一个新行上,然后是两个浮点数。这是正确的。
但是数组中仍然有剩余的项目。格式解释再次从新行开始,并再次为两个字符串和两个数字。但是数组不包含任何字符串...
试试 '(A,/, A,/, (F5.2, F5.2))'
。那会重复两次浮点数格式组,直到还有数字要处理,但是这次格式不会return到最开始。 (注意:答案的旧版本和未经测试的版本具有额外的重复计数 - 我没有意识到这会禁用格式还原。)
Vladimir F A
但与之对应的不是另一个字符变量。这是不允许的。
但是,该答案的较早版本中建议的格式也没有提供您期望的输出。如果你想在每一行上写成对的数字依赖于无限重复规范,你需要明确地将文件定位放入格式中:
write(*, '(2(A,/),*(2F5.2,:,/))') "1", "2", transpose(array)
如果最后没有 /
编辑,重复将意味着数组的所有元素都在同一条记录中。我们在那里也有 :
,所以我们在最后一个数组元素之后
(我也 transpose
d 输出数组,因为这可能是你真正的意思。原始输出中隐含的 do 循环有点出乎意料,首先移动最终索引更有意义.)
对于有限的重复规范,如该答案的更正形式所示,格式反转确实意味着定位:
write(*, '(2(A,/), 2(F5.2))') "1","2", transpose(array)
处理完 2(F5.2)
后,在仍有元素要写出的情况下,回退已重用此内容。
总而言之,如果您依靠格式还原来“跳过”格式的较早部分同时保留新记录,则必须正确标记整个格式的部分以还原为使用括号。只有整个格式都被括号包围,没有其他格式,格式还原会重用整个格式。