首页 > 教程 > 正文

阅读排行

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

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

Intent属性对结构体中动态数组的影响
下面一段代码中,我们在模块m_dat中定义了一个包含动态数组的结构体dat,结构体dat具有方法load,用于分配内存以及初始化变量。主程序中两次调用load方法,对结构体中动态数组进行内存分配和赋值,并输出结果。
01module m_dat
02    type dat
03      real,allocatable::a(:)
04   contains
05   procedure,pass:: load
06   end type
07contains
08integer function load(obj)
09   class(dat),intent(inout):: obj
10   integer::k=0
11   k=k+1
12   allocate(obj.a(k))
13   obj.a=k
14   load=0
15end function
16end module
17  
18program y
19   use m_dat
20   type(dat) d
21   integer i
22  
23   i=d.load()
24   print*,d.a(1)
25   pause
26  
27   i=d.load()
28   print*,d.a(1)
29   pause
30end
运行时出现如下错误,是因为我们两次对同一动态数组分配内存。

 \
我们对代码中的load方法作一些修改。先检测数组是否已分配,如果已分配内存,则将其释放掉,然后再分配。修改后代码如下:
1integer function load(obj)
2   class(dat),intent(inout):: obj
3   integer::k=0
4   k=k+1
5   if(allocated(obj.a)) deallocate(obj.a)
6   allocate(obj.a(k))
7   obj.a=k
8   load=0
9end function
 
代码修改后,程序便能正确执行,结果如下图。
\
 
基于本文的主旨,我们讨论另一种情况。修改load方法的代码:
可以看出,相对于文章开头的代码,我们只是将形参obj的intent属性由inout改为了out,而并未添加检测数组是否已分配的操作。程序能够正确执行,运行结果与上图一致。
1integer function load(obj)
2   class(dat),intent(out):: obj
3   integer::k=0
4   k=k+1
5   allocate(obj.a(k))
6   obj.a=k
7   load=0
8end function

 结论:如果函数中形参obj为包含动态数组的结构体变量,执行该函数时,如果obj具有intent(inout)属性(缺省), 对应的实参会被原样传递给obj;如果具有intent(out)属性,那么在,将首先释放结构体变量中动态数组所占用的内存空间。

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

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

分享到:           收藏