在I/O语句中,格式说明符上的重复次数不一定是数据列表中数组的维度。多个不同的数据项对应一个重复的格式说明符是完全合法的,例如:
write(unit,'(3f5.1)') x,y,z
或者一个数组对应于几个不同的格式说明符:
real::a(3)
write(unit,'(f5.1,f10.2,f5.1)') a
如果格式说明符的数量超过数据列表所需的数量(可以使用动态边界和/或暗示-do 变量),包括但不限于重复说明符,则多余的说明符将被忽略。因此,传统方式(至少追溯到F66)处理可变数量的数据项(在一维中)是使用一个“巨大”的重复计数器,其大小至少与数据一样大。
您的数组由 complex
元素组成,因此每个元素实际上有两个值,格式重复必须至少是元素数量的两倍。
自从F77以来,格式可以是字符变量,您可以使用“内部” WRITE 设置该(或任何其他)字符变量的值,这允许构造并使用一个数据相关的格式。该方法允许您将二维数组的格式调整到一个(精确的)维度。
以下是针对您情况的这两种方法的示例:
program SO43482939
integer,parameter::dimx=2,dimy=3,dim=4
complex,allocatable::mata(:,:),vecb(:)
character(len=80)::fmt
integer i,j
allocate (mata(dimx,dimy),vecb(dim))
do i=1,dimx
do j=1,dimy
mata(i,j)=complex(i*10+j,i*10+j)
end do
end do
do i=1,dim
vecb(i)=complex(i*10+j,i*10+j)
end do
write(*,'(999f5.1)') vecb
write(fmt,'(a,i5,a)') '(',2*dimx,'f5.1)'
write(*,'(a)') fmt
write(*,fmt) mata
end program
OUTPUT
14.0 14.0 24.0 24.0 34.0 34.0 44.0 44.0
( 4f5.1)
11.0 11.0 21.0 21.0
12.0 12.0 22.0 22.0
13.0 13.0 23.0 23.0