使用 allocatable/assumed-size 数组和名称列表读写
Using allocatable/assumed-size arrays with namelist read write
我正在使用 VS2012 和 Intel Visual Fortran 2015。
根据https://software.intel.com/en-us/forums/topic/269585,现在允许使用可分配和假定大小的数组,并具有名称列表读写;但是,我仍然收到错误 "A namelist-group-object must not be an assumed-size array".
示例代码:
subroutine writeGrid(fname, grid)
character*(*) :: fname
real*8, dimension(:,:) :: grid
namelist /gridNML/ grid
open(1, file=fname)
write(1, nml=gridNML)
close(1)
end subroutine writeGrid
我启用了 F2003 语义。
我错过了什么?
这看起来像是一个编译器错误。数组 grid
是 假定的形状 ,而不是 假定的大小 。自 F2003 起,允许在名称列表中使用假定形状数组,但仍禁止假定大小数组(在运行时,假定大小数组的大小不一定已知,因此禁止需要知道大小的操作)。
一个简单的解决方法是将虚拟参数重命名为其他名称,然后将其值复制到名为 grid
.
的本地可分配表中
subroutine writeGrid(fname, grid_renamed)
character*(*) :: fname
real, dimension(:,:) :: grid_renamed
real, dimension(:,:), allocatable :: grid
namelist /gridNML/ grid
open(1, file=fname)
allocate(grid, source=grid_renamed)
write(1, nml=gridNML)
close(1)
end subroutine writeGrid
我正在使用 VS2012 和 Intel Visual Fortran 2015。
根据https://software.intel.com/en-us/forums/topic/269585,现在允许使用可分配和假定大小的数组,并具有名称列表读写;但是,我仍然收到错误 "A namelist-group-object must not be an assumed-size array".
示例代码:
subroutine writeGrid(fname, grid)
character*(*) :: fname
real*8, dimension(:,:) :: grid
namelist /gridNML/ grid
open(1, file=fname)
write(1, nml=gridNML)
close(1)
end subroutine writeGrid
我启用了 F2003 语义。
我错过了什么?
这看起来像是一个编译器错误。数组 grid
是 假定的形状 ,而不是 假定的大小 。自 F2003 起,允许在名称列表中使用假定形状数组,但仍禁止假定大小数组(在运行时,假定大小数组的大小不一定已知,因此禁止需要知道大小的操作)。
一个简单的解决方法是将虚拟参数重命名为其他名称,然后将其值复制到名为 grid
.
subroutine writeGrid(fname, grid_renamed)
character*(*) :: fname
real, dimension(:,:) :: grid_renamed
real, dimension(:,:), allocatable :: grid
namelist /gridNML/ grid
open(1, file=fname)
allocate(grid, source=grid_renamed)
write(1, nml=gridNML)
close(1)
end subroutine writeGrid