Arrays 用Fortran 90编写动态数组

Arrays 用Fortran 90编写动态数组,arrays,formatting,fortran,output,fortran90,Arrays,Formatting,Fortran,Output,Fortran90,我有动态维度的数组(dimx,dim),我需要一种方法通过write指令在文件中写入这样的数组,问题是直到现在我还不能自动生成这样的文件,我的意思是,到目前为止,我必须手动更改Write指令中数组的维数,我需要一种方式,使维数根据维数dimx和dim的不同而变化,具体方式如下: integer :: dimx, dim complex, allocatable :: matA(:,:), vectB(:) allocate(matA(dimx,dimx), vectB(dim)) w

我有动态维度的数组(
dimx
dim
),我需要一种方法通过
write
指令在文件中写入这样的数组,问题是直到现在我还不能自动生成这样的文件,我的意思是,到目前为止,我必须手动更改
Write
指令中数组的维数,我需要一种方式,使维数根据维数
dimx
dim
的不同而变化,具体方式如下:

integer :: dimx, dim 
complex, allocatable :: matA(:,:), vectB(:)

 allocate(matA(dimx,dimx), vectB(dim))  

write(1,'(**dimx** e16.6) matA
write(2,'(**dim** e16.6) vecB

有办法做到这一点吗?

I/O语句中格式说明符的重复计数不一定是数据列表中数组的维数。多个不同的数据项对应一个重复的格式说明符是完全合法的,如:

 write(unit,'(3f5.1)') x,y,z
或者,对于一个数组,它对应于多个不同的格式说明符:

 real::a(3)
 write(unit,'(f5.1,f10.2,f5.1)') a
如果数据列表的格式说明符多于所需的数量(可以使用动态边界和/或隐含do变量),包括但不限于重复的说明符,则会忽略额外的说明符。因此,处理数量可变的数据项(在一个维度中)的传统方法(至少返回F66)是使用至少与数据一样大的“巨大”重复计数

数组由
复杂的
元素组成,因此每个元素实际上是两个值,格式重复必须至少是元素数的两倍

由于F77格式可以是字符变量,您可以使用“内部”写入设置该(或任何其他)字符变量的值,这允许构造和使用数据相关格式。此方法允许您将二维阵列的格式调整为一(精确)维

以下示例显示了针对您的案例的这两种方法:

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

补充另一个答案,以及评论中提到的近副本中未涉及的事项

2008年语言标准引入了无限格式项的概念,这是一种语言标准机制,可以根据需要多次重复格式规范。在过去,可能在格式规范之前有一个非常大的数字(如@dave_thompson_085所述),现在可以使用
*
来代替,例如

write(1,'(*(e16.6))') matA
而不是

write(1,'(999(e16.6))') matA

许多常用的编译器已经实现了这一功能。

请始终使用标签来回答Firtran问题。您可以添加特定的版本标记,但它只是补充。其他人,也请重新标记,当我自己这样做时,我失去了关闭副本的能力(尽管这可能是一件好事,取决于我的判断能力)。即使数量不限,我们也有副本