使用隐式循环打印Fortran数组

时间:2016-08-17 16:51:36

标签: arrays printing formatting fortran

此程序尝试使用格式规范中的隐式循环在一行上打印数组失败。它成功地通过显式循环完成工作。

program cycle
    implicit none
    integer, dimension(5) :: a=(/1,2,3,4,5/), b=(/11,12,13,14,15/)
    integer :: n, i

    Print *, "Implicit loop"
    print "(i0, 1x)", (a(i)*b(i), i=1,n)
    Print *, "Explicit loop"
    do i=1,n-1
        write(*, '(i0, 1x)', advance = "no") a(i)*b(i)
    end do
    write(*, '(i0)') a(n)*b(n)
end program cycle

结果如下:

 Implicit loop
11
24
39
 Explicit loop
11 24 39

如何让隐式循环在一行上打印所有内容?它甚至可能吗?我插入advance="no"的尝试,包括各种逗号和括号,都没有用。

3 个答案:

答案 0 :(得分:2)

格式化字符串仅支持两个项目,一个整数和一个空格。之后,启动一条新记录,并从头开始解释格式字符串。

(i0, 1x)

您必须将其转换为多个项目

(999(i0, 1x))

或(Fortran 2008)

(*(i0, 1x))

然后括号的使用次数与前面的数字相同。 *无限期地意味着。当然只要I / O列表中的项目仍有待处理。

答案 1 :(得分:0)

目前,我不能发表评论,因为我的声誉较低,所以把它写成答案。弗拉基米尔的答案是完美的。但要添加该答案,您还可以执行以下操作:

         integer, parameter :: n=5    ! this line was missing in the question
         write(fmt, 5)n , "(i0, 1x)"
  5      format('(', I2, A9, ')')
         write(*,*)"Implicit loop, formatted"
         write(*, fmt) (a(i)*b(i), i=1,n)

对于显式循环,您可以使用new_line在Fortran 2003或更高版本中执行以下操作:

    Print *, "Explicit loop 2"
    do i=1,n  ! notice the loop ends at 'n'
        write(*, '(i0, 1x)', advance = "no") a(i)*b(i)
    end do
    write(*, *) new_line('')

这适用于intel和gfortran。

答案 2 :(得分:0)

首先,非推进I / O可能仅在外部文件上执行,并且不能用于名称列表或列表定向I / O.

其次,重复计数可以应用于一组编辑描述符, 括在括号中:

print '(4(i5,f10.3))', (bar(j), foo(j), j=1,4)

(适用于整数bar和实数foo)。这相当于写作

print '(i5,f10.3,i5,f10.3,i5,f10.3,i5,f10.3)', (bar(j), foo(j), j=1,4)

这样的重复计数可以嵌套:

print '(2(2i5,2f10.3))', bar(1),bar(2),foo(1),foo(2),bar(3),bar(4),foo(3),foo(4)

第三,有三种方式可以给出format规范。它们如下:

(1)默认字符表达(我偏见的最佳方法):

print '(f10.3)', foo
write(*, '(f10.3)') foo

character(len=*), parameter :: FMT='(f10.3)'

print FMT, foo
write(*, FMT) foo

character, parameter :: FMT_ARRAY(*)=[ '(','f','1','0','.','3',')' ]

! Elements of an array expression are concatenated.
print FMT_ARRAY, foo
write(*, FMT_ARRAY) foo 

or

character(4) :: fmt_1(10)
character(3) :: fmt_2(10)
integer      :: i, j

fmt_1(10) = '(f10'
fmt_2(3) = '.3)'

i = 10
j = 3

! Format is built dynamically at execution time from various components.
print fmt_11(i)//fmt_2(j), foo 
write(*, fmt_11(i)//fmt_2(j)) foo 

(2)星号(仅在代码的测试/开发阶段使用它):

print *, foo
write(*,*) foo

(3)声明标签(今天不是撒旦!2016年没有这个地方):

    print 42, foo
    write(*, 42) foo

42 format(f10.3)