2016-07-12 3 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

Смежные вопросы