forrtl: severe(151) 可分配数组已经分配
forrtl: severe(151) allocatable array already allocated
我使用了此答案中给出的代码 但是当我 运行 此代码
时出现 运行 时间错误
forrtl : severe(151) allocatable array is already allocated
当我用 -g
和 -traceback
重新编译时,错误追溯到这一行
allocate(lats(latlen))
可以在运行时修改内存吗?我正在使用 Fortran,编译器是 ifort
。
这是我的代码
integer retval,reason,i,in_ndim,ierr
integer ncid, lat_dimid,lat_varid, latlen
integer lon_varid,lonlen
character*(*) LAT_NAME, LON_NAME
parameter (LAT_NAME='lat', LON_NAME='lon')
real lats[allocatable](:)
real lons[allocatable](:)
call system('ls hgt_*.nc > hgtFiles.txt')
open(10,file='hgtFiles.txt',action="read")
varname = "hgt"
do
read(10,*,IOSTAT=reason) in_cfn
if (reason/=0) EXIT
print *,in_cfn
retval = nf_open(in_cfn,NF_NOWRITE,ncid)
if (retval .ne. nf_noerr) call handle_err(retval)
retval = nf_inq_dimid(ncid,LAT_NAME,lat_dimid)
if (retval .ne. nf_noerr) call handle_err(retval)
retval = nf_inq_dimlen(ncid,lat_dimid,latlen)
if (retval .ne. nf_noerr) call handle_err(retval)
print *,latlen
allocate(lats(latlen))
retval = nf_inq_varid(ncid,LAT_NAME,lat_varid)
if (retval .ne. nf_noerr) call handle_err(retval)
retval = nf_get_var_real(ncid,lat_varid,lats)
if (retval .ne. nf_noerr) call handle_err(retval)
print *,lats
end do
close(10)
您正在循环内分配 lats
。因此,在第二次迭代时它已经被分配并且失败并出现错误。你在这里基本上有两个选择:
- 如果维度在整个循环中没有改变,将分配拉到外面
- 或者在循环内重新分配数组。在最简单的情况下,您需要将
deallocate(lats)
放在循环体的末尾。
我使用了此答案中给出的代码
forrtl : severe(151) allocatable array is already allocated
当我用 -g
和 -traceback
重新编译时,错误追溯到这一行
allocate(lats(latlen))
可以在运行时修改内存吗?我正在使用 Fortran,编译器是 ifort
。
这是我的代码
integer retval,reason,i,in_ndim,ierr
integer ncid, lat_dimid,lat_varid, latlen
integer lon_varid,lonlen
character*(*) LAT_NAME, LON_NAME
parameter (LAT_NAME='lat', LON_NAME='lon')
real lats[allocatable](:)
real lons[allocatable](:)
call system('ls hgt_*.nc > hgtFiles.txt')
open(10,file='hgtFiles.txt',action="read")
varname = "hgt"
do
read(10,*,IOSTAT=reason) in_cfn
if (reason/=0) EXIT
print *,in_cfn
retval = nf_open(in_cfn,NF_NOWRITE,ncid)
if (retval .ne. nf_noerr) call handle_err(retval)
retval = nf_inq_dimid(ncid,LAT_NAME,lat_dimid)
if (retval .ne. nf_noerr) call handle_err(retval)
retval = nf_inq_dimlen(ncid,lat_dimid,latlen)
if (retval .ne. nf_noerr) call handle_err(retval)
print *,latlen
allocate(lats(latlen))
retval = nf_inq_varid(ncid,LAT_NAME,lat_varid)
if (retval .ne. nf_noerr) call handle_err(retval)
retval = nf_get_var_real(ncid,lat_varid,lats)
if (retval .ne. nf_noerr) call handle_err(retval)
print *,lats
end do
close(10)
您正在循环内分配 lats
。因此,在第二次迭代时它已经被分配并且失败并出现错误。你在这里基本上有两个选择:
- 如果维度在整个循环中没有改变,将分配拉到外面
- 或者在循环内重新分配数组。在最简单的情况下,您需要将
deallocate(lats)
放在循环体的末尾。