Fortran使用格式描述符输出数组结果与预期不符问题咨询
问题原因
这个输出异常是Fortran的格式控制复用规则和你编写的格式串结构不匹配导致的,具体逻辑如下:
- 你当前使用的格式串
'(A,/, A,/, F5.2, F5.2)'没有把需要重复输出的浮点格式部分单独用括号包裹,当输出项数量超过格式串可处理的数量时,格式控制会自动回到整个格式串的最开头复用规则,同时先插入一个换行。 - 你的输出项总数为:2个字符串 + 3×2=6个浮点数,共8个输出项。第一次遍历格式串时的处理流程:
- 用第一个
A输出字符串1,遇到/换行 - 用第二个
A输出字符串2,遇到/换行 - 用两个
F5.2输出前2个浮点数,此时格式串遍历完毕,还剩4个浮点数未输出
- 用第一个
- 触发格式复用逻辑:先自动换一行(这就是你看到的空行来源),然后回到格式串开头重新匹配。此时剩下的输出项都是浮点数,和格式串开头的
A(字符型编辑描述符)类型不匹配,属于未定义行为,你使用的onlinegdb编译器在类型不匹配时跳过了A编辑符对应的输出项消耗,继续向后执行,最终只又输出了2个浮点数,剩下的2个浮点数因为再次触发格式复用后仍存在类型不匹配被丢弃,就出现了你看到的异常输出。
修正方案
把需要重复输出的浮点格式部分单独用括号包裹,让格式复用的时候只回到浮点格式组的开头,不需要再匹配前面的字符编辑符:
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
修改后即可得到你预期的输出结果。
内容的提问来源于stack exchange,提问作者Wexel
相关产品推荐
相关产品推荐

