在FORTRAN中,如果调用已分配但分配后未更改的变量,会发生什么情况?
示例如下:在FORTRAN中,如果调用已分配但分配后未更改的变量,会发生什么情况?,fortran,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_
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)”中
我在代码上运行了PowerGREP,似乎“dates”数组没有分配到其他任何地方。我不完全了解Fortran的最新改进,但在Fortran-77中,这样的变量会有一个持久值,因此,除非显式赋值,否则调用之间的值不会改变。我并不完全了解最新的Fortran改进,但在Fortran-77中,这样的变量会有一个持久值,因此,除非显式赋值,否则调用之间的值不会发生变化。您是否在询问如果执行顺序分配(var),var=value,deallocate(var),然后使用“var”的值会发生什么?如果这是你的问题,这是非法和未定义的。即使您的源代码在解除分配后似乎没有更改“var”,该变量在解除分配后仍然是未定义的。Fortran可能会将该内存用于其他用途,因此,如果访问该变量,则可以获得任何值。您需要跟踪是否分配了变量,或者使用关联的内在函数来发现
编辑:正如@walklyk所写的,它取决于子程序wrap\u get\u var\u int中的内容。亚当斯等人在《Fortran 2003手册》中对它们进行了很好的解释。(你可以通过搜索“可分配参数”在谷歌图书上找到这些信息。)如果伪参数没有可分配属性,那么事情就显而易见了。。。子例程可以更改值(除非意图是“in”),您说它不会更改。如果虚拟对象具有allocatable属性,则有几种情况。如果“intent”为“out”,则变量在输入时自动释放!如果意图为out或inout,则该过程可以显式更改分配状态。您是否询问如果执行顺序allocate(var)、var=var、deallocate(var),然后使用“var”的值会发生什么?如果这是你的问题,这是非法和未定义的。即使您的源代码在解除分配后似乎没有更改“var”,该变量在解除分配后仍然是未定义的。Fortran可能会将该内存用于其他用途,因此,如果访问该变量,则可以获得任何值。您需要跟踪是否分配了变量,或者使用关联的内在函数来发现
编辑:正如@walklyk所写的,它取决于子程序wrap\u get\u var\u int中的内容。亚当斯等人在《Fortran 2003手册》中对它们进行了很好的解释。(你可以通过搜索“可分配参数”在谷歌图书上找到这些信息。)如果伪参数没有可分配属性,那么事情就显而易见了。。。子例程可以更改值(除非意图是“in”),您说它不会更改。如果虚拟对象具有allocatable属性,则有几种情况。如果“intent”为“out”,则变量在输入时自动释放!如果意图为out或inout,该过程可以显式更改分配状态。好的,那么“year”数组中每个条目的值将仅基于此代码吗?@inquirlinekea:我无法判断。
wrap\u get\u var\u int()
做什么?也许我误解了你(可能是因为时间晚了,我很累),但F77没有分配。你指的是过程调用之间过程中变量的状态吗?@Rook:是的,我指的是一般变量的范围和持久性。要在F77中进行动态分配,必须调用外部模块。最流行的是C运行时库,至少在VM和iNtel实现中是这样。Fortran 90中添加了“可分配”变量,Fortran 95中至少更改了一种行为。FORTRAN 77没有告诉任何人这个语言特性是如何工作的。例如,过程的本地可分配变量不是持久的。。。退出该过程后,将自动取消分配。。。从Fortran 95开始。好吧,那么“年”数组中的每个条目的值将仅基于此代码吗?@inquirlinekea:我没办法告诉你。wrap\u get\u var\u int()
做什么?也许我误解了你(可能是因为时间晚了,我很累),但F77没有分配。你指的是过程调用之间过程中变量的状态吗?@Rook:是的,我指的是一般变量的范围和持久性。要在F77中进行动态分配,必须调用外部模块。最流行的是C运行时库,至少在VM和iNtel实现中是这样。Fortran 90中添加了“可分配”变量,Fortran 95中至少更改了一种行为。FORTRAN 77没有告诉任何人这个语言特性是如何工作的。例如,过程的本地可分配变量不是持久的。。。退出该过程后,将自动取消分配。。。从Fortran 95开始。哦,对不起,我把标题弄错了。我说的是在我先分配,然后使用变量var.Oops之后会发生什么。对不起,我把标题搞糟了。我说的是在我先分配,然后使用变量var之后会发生什么。