2016-07-12 25 views
1

ich den Code in dieser Antwort gegeben verwendet habe Netcdf Fortran array allocation at run time aber ich einen Laufzeitfehler, wenn ich diesen Code ausführenforrtl: schwere (151) zuordenbare Array bereits zugewiesen

forrtl: schweres (151) zuordenbare Array bereits zugeteilten

Als ich mit -g und -traceback der Fehler neu kompilieren zu dieser Linie wird zurückverfolgt

allocate(lats(latlen)) 

Kann Speicher zur Laufzeit geändert werden? Ich verwende Fortran und der Compiler ist ifort.

Hier ist mein Code

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) 

Antwort

2

Du lats innerhalb der Schleife zugeordnet werden. Daher ist es bei der zweiten Iteration bereits zugewiesen und schlägt mit dem Fehler fehl, den Sie erhalten haben. Sie haben grundsätzlich zwei Möglichkeiten:

  • Wenn die Dimensionen, nicht in der gesamten Schleife ändern, um die Zuweisung außerhalb
  • ziehen oder Ihr Array innerhalb der Schleife neu zuteilen. Im einfachsten Fall müssen Sie deallocate(lats) am Ende des Schleifenkörpers setzen.
+0

danke! Löste mein Problem !! – gansub