我有动态维度的数组(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
有办法做到这一点吗?
答案 0 :(得分:3)
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
答案 1 :(得分:3)
补充其他答案,以及评论中提到的近似重复内容未涵盖的事项......
2008语言标准引入了 unlimited-format-item 的概念,这是一种语言标准机制,可根据需要多次重复格式规范。在过去的日子里,可能会在格式规范之前加上一个非常大的数字(如@ dave_thompson_085所提到的),现在可以使用*
代替,例如
write(1,'(*(e16.6))') matA
而不是
write(1,'(999(e16.6))') matA
许多常用的编译器已经实现了这个功能。