读取名单中的数组部分
Read array sections in namelist
考虑一个包含二维数组的名单。
例如,以下程序从文件“input.dat”中读取。
program test
use :: iso_fortran_env
implicit none
integer :: ierr, unit, i
real(kind=kind(0.0d0)), allocatable :: p(:, :)
namelist /VAR_p/ p
allocate(p(2,2))
open(newunit=unit, file='input.dat', status='old', iostat=ierr)
read(unit, nml=VAR_p, iostat=ierr)
close(unit)
do i = 1, size(p, 1)
write(output_unit, '(F4.2," ",F4.2)') p(i,1), p(i,2)
end do
end program test
可以将“input.dat”中的数组 p 提供为
! input.dat
&VAR_p
p(1,1) = 1.2
p(1,2) = 3.2
p(2,1) = 1.0
p(2,2) = 0.0
/
有了这个输入,程序运行正常。不过,我宁愿逐行提供数组 p。像
! input.dat
&VAR_p
p(1,:) = (1.2, 3.2)
p(2,:) = (1.30, 0.0)
/
是否有实现该目标的语法?
确实有一种语法可以在名单记录中指定数组部分。它接近要求的形式,但不完全是。
在名单记录中,项目 (1.30, 0.0)
指定了一个复数值而不是数组构造函数(这意味着 (1.3, 0.0, 1.2)
的泛化不是有效值)。相反,您只想指定一个值列表:1.3, 0.0
:
&VAR_p
p(1,:) = 1.2, 3.2
p(2,:) = 1.30, 0.0
/
注意事项有一些限制:
- 左边的指示符可以是数组部分,但不能是向量下标;
- 右侧值的数量不能大于左侧数组元素的数量。
在第二种情况下,如果右侧的值比左侧的元素少,那么就好像右侧用空值填充一样。
考虑一个包含二维数组的名单。 例如,以下程序从文件“input.dat”中读取。
program test
use :: iso_fortran_env
implicit none
integer :: ierr, unit, i
real(kind=kind(0.0d0)), allocatable :: p(:, :)
namelist /VAR_p/ p
allocate(p(2,2))
open(newunit=unit, file='input.dat', status='old', iostat=ierr)
read(unit, nml=VAR_p, iostat=ierr)
close(unit)
do i = 1, size(p, 1)
write(output_unit, '(F4.2," ",F4.2)') p(i,1), p(i,2)
end do
end program test
可以将“input.dat”中的数组 p 提供为
! input.dat
&VAR_p
p(1,1) = 1.2
p(1,2) = 3.2
p(2,1) = 1.0
p(2,2) = 0.0
/
有了这个输入,程序运行正常。不过,我宁愿逐行提供数组 p。像
! input.dat
&VAR_p
p(1,:) = (1.2, 3.2)
p(2,:) = (1.30, 0.0)
/
是否有实现该目标的语法?
确实有一种语法可以在名单记录中指定数组部分。它接近要求的形式,但不完全是。
在名单记录中,项目 (1.30, 0.0)
指定了一个复数值而不是数组构造函数(这意味着 (1.3, 0.0, 1.2)
的泛化不是有效值)。相反,您只想指定一个值列表:1.3, 0.0
:
&VAR_p
p(1,:) = 1.2, 3.2
p(2,:) = 1.30, 0.0
/
注意事项有一些限制:
- 左边的指示符可以是数组部分,但不能是向量下标;
- 右侧值的数量不能大于左侧数组元素的数量。
在第二种情况下,如果右侧的值比左侧的元素少,那么就好像右侧用空值填充一样。