【问题标题】:forrtl: severe(151) allocatable array already allocatedforrtl:严重(151)可分配数组已分配
【发布时间】:2016-07-12 20:59:23
【问题描述】:

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

forrtl:severe(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)

【问题讨论】:

    标签: arrays fortran allocation


    【解决方案1】:

    您在循环内分配lats。因此,在第二次迭代时,它已经被分配并且失败并出现您得到的错误。您在这里基本上有两个选择:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-19
      • 2020-05-14
      • 2018-09-01
      • 2012-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多