首页 >

Intent属性对结构体中动态数组的影响

作者:li913  日期:05-13
来源:Fcode研讨团队
Intent属性对结构体中动态数组的影响
下面一段代码中,我们在模块m_dat中定义了一个包含动态数组的结构体dat,结构体dat具有方法load,用于分配内存以及初始化变量。主程序中两次调用load方法,对结构体中动态数组进行内存分配和赋值,并输出结果。
module m_dat
    type dat
      real,allocatable::a(:)
   contains
   procedure,pass:: load
   end type
contains
integer function load(obj)
   class(dat),intent(inout):: obj
   integer::k=0
   k=k+1
   allocate(obj.a(k))
   obj.a=k
   load=0
end function
end module
 
program y
   use m_dat
   type(dat) d
   integer i
 
   i=d.load()
   print*,d.a(1)
   pause
 
   i=d.load()
   print*,d.a(1)
   pause
end
运行时出现如下错误,是因为我们两次对同一动态数组分配内存。


大图
我们对代码中的load方法作一些修改。先检测数组是否已分配,如果已分配内存,则将其释放掉,然后再分配。修改后代码如下:
integer function load(obj)
   class(dat),intent(inout):: obj
   integer::k=0
   k=k+1
   if(allocated(obj.a)) deallocate(obj.a)
   allocate(obj.a(k))
   obj.a=k
   load=0
end function

代码修改后,程序便能正确执行,结果如下图。

大图

基于本文的主旨,我们讨论另一种情况。修改load方法的代码:
可以看出,相对于文章开头的代码,我们只是将形参obj的intent属性由inout改为了out,而并未添加检测数组是否已分配的操作。程序能够正确执行,运行结果与上图一致。
integer function load(obj)
   class(dat),intent(out):: obj
   integer::k=0
   k=k+1
   allocate(obj.a(k))
   obj.a=k
   load=0
end function

结论:如果函数中形参obj为包含动态数组的结构体变量,执行该函数时,如果obj具有intent(inout)属性(缺省), 对应的实参会被原样传递给obj;如果具有intent(out)属性,那么在,将首先释放结构体变量中动态数组所占用的内存空间。
常规|工具|专业|读物|
代码|教学|算法|
首页 >
FortranCoder手机版-导航