Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在FORTRAN中,如果调用已分配但分配后未更改的变量,会发生什么情况?_Fortran - Fatal编程技术网

在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之后会发生什么。