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) 放在循环体的末尾。