forrtl:已分配严重(151)可分配数组

时间:2016-07-12 12:53:03

标签: arrays fortran allocation

我已经使用了这个答案Netcdf Fortran array allocation at run time中给出的代码,但是当我运行此代码时出现运行时错误

  

forrtl:已分配严重(151)可分配数组

当我使用-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)

1 个答案:

答案 0 :(得分:2)

您正在循环中分配lats。因此,在第二次迭代时,它已经被分配并且失败并且出现了错误。你基本上有两个选择:

  • 如果尺寸在整个循环中没有变化,请在
  • 之外拉出分配
  • 或者在循环中重新分配您的数组。在最简单的情况下,您需要将deallocate(lats)放在循环体的末尾。