Displaying a table with two columns in Fortran with available data

前端 未结 2 1956
庸人自扰
庸人自扰 2020-12-12 04:10

I have two variables say x and y and both have around 60 points in them(basically values of the x and y axis of the plot)

相关标签:
2条回答
  • 2020-12-12 05:00

    There is already an answer saying how to get the output as wanted. It may be good, though, to explicitly say why the (unwanted) output as in the question comes about.

    In the (generalized) statement

    write(unit,fmt) xpts, ypts
    

    the xpts, ypts is the output list. In the description of how the output list is treated we see (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

    That is, it shouldn't be too surprising that (assuming the lower bound of xpts and ypts are 1)

    write(unit, fmt) xpts(1), xpts(2), xpts(3), ..., ypts(1), ypts(2), ...
    

    gives the output seen.

    Using a do loop expanded as

    write(unit, fmt) xpts(1), ypts(1)
    write(unit, fmt) xpts(2), ypts(2)
    ...
    

    is indeed precisely what is wanted here. However, a more general "give me the elements of the arrays interleaved" could be done with an output implied-do:

    write(unit, fmt) (xpts(i), ypts(i), i=LBOUND(xpts,1),UBOUND(xpts,1))
    

    (assuming that the upper and lower bounds of ypts are the same as xpts).

    This is equivalent to

    write(unit, fmt) xpts(1), ypts(1), xpts(2), ypts(2), ...
    

    (again, for convenience switching to the assumption about lower bounds).

    This implied-do may be more natural in some cases. In particular note that the first explicit do loop writes one record for each pair of elements from xpts and ypts; for the implied-do the new record comes about from format reversion. The two for the format in the question are equivalent, but for some more exotic formats the former may not be what is wanted and it ties the structure of the do loop to the format.

    This splitting of records holds even more so for unformatted output (which hasn't format reversion).

    0 讨论(0)
  • 2020-12-12 05:06

    You could use a do loop:

    do i=1,size(xpts)
      write(21,"(T2,F10.4: T60,F10.4)"), xpts(i), ypts(i)
    enddo
    
    0 讨论(0)
提交回复
热议问题