在FORTRAN中,如果我调用已分配但在分配后未更改的变量会发生什么?

时间:2011-09-03 19:22:22

标签: fortran

此处示例:

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”数组。

2 个答案:

答案 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中,这些变量会有持久值,因此除非明确指定,否则值不会因调用而改变。