首页 > 教程 > 正文

阅读排行

Intent属性对结构体中动态数组的影响
2014-05-13 10:36:13   来源:Fcode研讨团队   评论:0 点击:

本文讨论了包含动态数组的结构体,作为虚参传递时,Intent 属性对它的影响。

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)属性,那么在,将首先释放结构体变量中动态数组所占用的内存空间。

相关热词搜索:intent属性 结构体 动态数组

上一篇:在子过程中为动态数组分配内存
下一篇:用二进制直接存取方式更新文件时需注意的细节

分享到: 收藏