此程序尝试使用格式规范中的隐式循环在一行上打印数组失败。它成功地通过显式循环完成工作。
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"
的尝试,包括各种逗号和括号,都没有用。
答案 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)