2016-07-12 54 views
1

我已經使用這個答案Netcdf Fortran array allocation at run time給出的代碼,但我得到一個運行時錯誤,當我運行此代碼forrtl:嚴重(151)分配數組已分配

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) 

回答

2

您分配lats內循環。因此,在第二次迭代中,它已經被分配了,並且因爲你得到的錯誤而失敗。基本上,你這裏有兩種選擇:

  • 如果尺寸不整個循環改變,拉動外
  • 的分配或重新分配的循環中的數組。在最簡單的情況下,您需要在循環體的末尾放置deallocate(lats)
+0

謝謝!解決了我的問題! – gansub