在Fortran中显示包含两列的表,并提供可用数据

时间:2015-02-24 09:17:35

标签: fortran

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

2 个答案:

答案 0 :(得分:4)

您可以使用do循环:

do i=1,size(xpts)
  write(21,"(T2,F10.4: T60,F10.4)"), xpts(i), ypts(i)
enddo

答案 1 :(得分:1)

已经an answer说了如何获得所需的输出。但是,明确说明为什么问题中出现(不需要的)输出可能会很好。

在(通用)陈述中

write(unit,fmt) xpts, ypts

xpts, ypts是输出列表。在如何处理输出列表的描述中,我们看到(Fortran 2008 9.6.3)

  

如果数组显示为输入/输出列表项,则将其视为元素(如果有)以数组元素顺序指定

也就是说,假设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)
...

确实是这里想要的。但是,更通用的“给我交错的数组元素”可以用输出暗示来完成:

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循环的结构与格式联系起来。

对于未格式化的输出(没有格式化版本反转),这种记录拆分更为重要。