此处示例:
integer, allocatable , dimension(:) :: dates, datesecs
!
! open file and get fileid
!
if (masterproc) then
call getfil( fname, filen, 0 )
call wrap_open( filen, 0, fileid )
write(6,*)'open_met_datafile: ',trim(filen)
endif
call get_dimension( fileid, 'time', timesize )
if ( associated(times) ) deallocate(times)
allocate( times(timesize) )
if (masterproc) then
allocate( dates(timesize) )
allocate( datesecs(timesize) )
call wrap_inq_varid( fileid, 'date', dateid )
call wrap_inq_varid( fileid, 'datesec', secid )
call wrap_get_var_int( fileid, dateid, dates )
call wrap_get_var_int( fileid, secid, datesecs )
do i=1,timesize
year = dates(i) / 10000
month = mod(dates(i),10000)/100
day = mod(dates(i),100)
times(i) = get_time_float( year, month, day, datesecs(i) )
enddo
deallocate( dates )
deallocate( datesecs )
endif ! masterproc
代码实际上在“子例程open_met_datafile(grid,fname,fileid,times,check_dims)”中 - 在http://www.cesm.ucar.edu/models/cesm1.0/cesm/cesmBbrowser/html_code/cam/metdata.F90.html
我在代码上运行了一个PowerGREP,似乎没有在其他任何地方分配“dates”数组。
答案 0 :(得分:1)
您是否在询问如果执行序列allocate(var),var = value,deallocate(var)会发生什么,然后使用“var”的值?如果这是你的问题,这是非法的和未定义的。即使您的源代码在解除分配后似乎没有更改“var”,但在解除分配后该变量仍未定义。 Fortran可能会将该内存重用于其他目的,因此如果您访问该变量,则可以获得任何值。您需要跟踪是否已分配变量,或使用关联的内在函数来查找。
编辑:正如@walklyk所写,这取决于子程序wrap_get_var_int中的内容。有很多情况。在Adams等人的“Fortran 2003手册”中对它们进行了很好的解释。 (您可以通过搜索“allocatable argument”在Google图书上找到此信息。)如果伪参数没有allocatable属性,那么事情就很明显......子例程可以更改值(除非意图是“in” ),你说它没有。如果虚拟对象具有可分配属性,则有几种情况。如果“intent”为“out”,则变量在进入时自动解除分配!如果意图已经完成或不在意,那么该过程可以明确地改变分配状态。
答案 1 :(得分:0)
我没有完全掌握最新的Fortran改进,但在Fortran-77中,这些变量会有持久值,因此除非明确指定,否则值不会因调用而改变。