在具有可用数据的 Fortran 中显示具有两列的 table
Displaying a table with two columns in Fortran with available data
我有两个变量 x
和 y
,它们都有大约 60 个点(基本上是图的 x
和 y
轴的值) .现在,当我尝试以列或 table 的形式将其显示在结果文件中时,具有 x
值和相应的 y
值,我最终得到所有 x
值显示在两列中,然后是 y
值。我无法正确取出它。
这是代码的一小部分
xpts = PIC1(1,6:NYPIX,1)
ypts = PIC1(2,6:NYPIX,1)
write(21,*), NYPIX
write(21,"(T2,F10.4: T60,F10.4)"), xpts, ypts
这是我得到的输出。 x
值从 1
列继续到 2
直到显示所有内容,然后显示 y
值。
128.7018 128.7042
128.7066 128.7089
128.7113 128.7137
128.7160 128.7184
128.7207 128.7231
128.7255 128.7278
128.7302 128.7325
128.7349 128.7373
128.7396 128.7420
128.7444 128.7467
128.7491 128.7514
128.7538 128.7562
128.7585 128.7609
128.7633 128.7656
128.7680 128.7703
128.7727 128.7751
128.7774 128.7798
128.7822 128.7845
128.7869 128.7892
128.7916 128.7940
128.7963 128.7987
128.8011 128.8034
86.7117 86.7036
86.6760 86.6946
86.6317 86.6467
86.6784 86.8192
86.8634 87.0909
87.2584 87.6427
88.1245 88.8343
89.5275 90.2652
91.0958 91.8668
92.6358 93.2986
93.8727 94.4631
您可以使用 do
循环:
do i=1,size(xpts)
write(21,"(T2,F10.4: T60,F10.4)"), xpts(i), ypts(i)
enddo
已经 说明了如何获得所需的输出。不过,明确说明问题中出现(不需要的)输出的原因可能会很好。
在(广义)陈述中
write(unit,fmt) xpts, ypts
xpts, ypts
是输出列表。在如何处理输出列表的描述中,我们看到 (Fortran 2008 9.6.3)
If an array appears as an input/output list item, it is treated as if the elements, if any, were specified in array element order
也就是说,(假设xpts
和ypts
的下界是1
)
也不足为奇
write(unit, fmt) xpts(1), xpts(2), xpts(3), ..., ypts(1), ypts(2), ...
给出看到的输出。
使用 do 循环扩展为
write(unit, fmt) xpts(1), ypts(1)
write(unit, fmt) xpts(2), ypts(2)
...
确实正是这里想要的。但是,更一般的 "give me the elements of the arrays interleaved" 可以通过输出 implied-do:
来完成
write(unit, fmt) (xpts(i), ypts(i), i=LBOUND(xpts,1),UBOUND(xpts,1))
(假设ypts
的上下界与xpts
相同)。
这相当于
write(unit, fmt) xpts(1), ypts(1), xpts(2), ypts(2), ...
(同样,为了方便切换到关于下限的假设)。
这种隐含的行为在某些情况下可能更自然。特别要注意,第一个显式 do 循环为 xpts
和 ypts
中的每对元素写入一条记录;对于隐含的做,新记录来自格式反转。问题中格式的两个是等效的,但对于一些更奇特的格式,前者可能不是我们想要的,它将 do 循环的结构与格式联系起来。
这种记录拆分对于未格式化的输出(没有格式转换)更是如此。
我有两个变量 x
和 y
,它们都有大约 60 个点(基本上是图的 x
和 y
轴的值) .现在,当我尝试以列或 table 的形式将其显示在结果文件中时,具有 x
值和相应的 y
值,我最终得到所有 x
值显示在两列中,然后是 y
值。我无法正确取出它。
这是代码的一小部分
xpts = PIC1(1,6:NYPIX,1)
ypts = PIC1(2,6:NYPIX,1)
write(21,*), NYPIX
write(21,"(T2,F10.4: T60,F10.4)"), xpts, ypts
这是我得到的输出。 x
值从 1
列继续到 2
直到显示所有内容,然后显示 y
值。
128.7018 128.7042
128.7066 128.7089
128.7113 128.7137
128.7160 128.7184
128.7207 128.7231
128.7255 128.7278
128.7302 128.7325
128.7349 128.7373
128.7396 128.7420
128.7444 128.7467
128.7491 128.7514
128.7538 128.7562
128.7585 128.7609
128.7633 128.7656
128.7680 128.7703
128.7727 128.7751
128.7774 128.7798
128.7822 128.7845
128.7869 128.7892
128.7916 128.7940
128.7963 128.7987
128.8011 128.8034
86.7117 86.7036
86.6760 86.6946
86.6317 86.6467
86.6784 86.8192
86.8634 87.0909
87.2584 87.6427
88.1245 88.8343
89.5275 90.2652
91.0958 91.8668
92.6358 93.2986
93.8727 94.4631
您可以使用 do
循环:
do i=1,size(xpts)
write(21,"(T2,F10.4: T60,F10.4)"), xpts(i), ypts(i)
enddo
已经
在(广义)陈述中
write(unit,fmt) xpts, ypts
xpts, ypts
是输出列表。在如何处理输出列表的描述中,我们看到 (Fortran 2008 9.6.3)
If an array appears as an input/output list item, it is treated as if the elements, if any, were specified in array element order
也就是说,(假设xpts
和ypts
的下界是1
)
write(unit, fmt) xpts(1), xpts(2), xpts(3), ..., ypts(1), ypts(2), ...
给出看到的输出。
使用 do 循环扩展为
write(unit, fmt) xpts(1), ypts(1)
write(unit, fmt) xpts(2), ypts(2)
...
确实正是这里想要的。但是,更一般的 "give me the elements of the arrays interleaved" 可以通过输出 implied-do:
来完成write(unit, fmt) (xpts(i), ypts(i), i=LBOUND(xpts,1),UBOUND(xpts,1))
(假设ypts
的上下界与xpts
相同)。
这相当于
write(unit, fmt) xpts(1), ypts(1), xpts(2), ypts(2), ...
(同样,为了方便切换到关于下限的假设)。
这种隐含的行为在某些情况下可能更自然。特别要注意,第一个显式 do 循环为 xpts
和 ypts
中的每对元素写入一条记录;对于隐含的做,新记录来自格式反转。问题中格式的两个是等效的,但对于一些更奇特的格式,前者可能不是我们想要的,它将 do 循环的结构与格式联系起来。
这种记录拆分对于未格式化的输出(没有格式转换)更是如此。