Fortran For Fun之自动数组分配

fortran系列之自动数组分配

自动分配

动态数组可以不用显式的指定其大小,它会根据等号右边的数组自动分配空间

1
2
3
4
5
6
7
program main
implicit none
integer, parameter :: ivp(*) = [1,2,3,4,5]
integer, allocatable :: iv(:)
iv = [1,2,3,4,5]
if(all(iv==ivp)) print*, 'pass'
end program

结果:

1
pass

自动重新分配

动态数组会将等号右边的数组分配给等号左端,然后将原来的空间释放掉

1
2
3
4
5
6
7
8
program main
implicit none
integer, parameter :: ivp(*) = [1,2,3,4,5]
integer, allocatable :: iv(:)
iv = (/1,2,3/) !< allocate lhs, another array constructor
iv = [1,2,3,4,5] !< reallocate lhs
if(all(iv==ivp)) print*, 'pass'
end program

结果:

1
pass

数组扩展

可以根据数组构造函数不断的扩展数组的大小

1
2
3
4
5
6
7
8
9
10
11
program main
implicit none
integer, parameter :: ivp(*) = [1,2,3,4,5]
integer, allocatable :: iv(:)
integer :: i
iv = [integer ::] !< an empty array, empty array constructor
do i = 1,5
iv = [iv,i] !< append array
enddo
if(all(iv==ivp)) print*, 'pass'
end program

结果:

1
pass

读取未知数目数据

读取文件中的数组,其大小通常是未知的,可以使用数组扩展来进行读取。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
program main
integer, parameter :: ivp(*) = [1,2,3,4,5]
integer, allocatable :: iv(:)
integer :: i, ios, unit
iv = [integer ::]
open(newunit = unit, file='test.txt')
do
read(unit=unit,fmt=*,iostat=ios) i
if(ios /= 0) exit
iv = [iv,i]
enddo
close(unit)
if(all(iv==ivp)) print*, 'pass'
end program

新建一个’test.txt’文件,第1~5行输入1-5,得到结果:

1
pass