在具有可用数据的 Fortran 中显示具有两列的 table

Displaying a table with two columns in Fortran with available data

我有两个变量 xy,它们都有大约 60 个点(基本上是图的 xy 轴的值) .现在,当我尝试以列或 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

也就是说,(假设xptsypts的下界是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 循环为 xptsypts 中的每对元素写入一条记录;对于隐含的做,新记录来自格式反转。问题中格式的两个是等效的,但对于一些更奇特的格式,前者可能不是我们想要的,它将 do 循环的结构与格式联系起来。

这种记录拆分对于未格式化的输出(没有格式转换)更是如此。