Saphy 发表于 2014-5-16 22:39:24

Fortran指针和指针函数的问题

问题1:
我们知道,子程序中使用Allocate语句动态分配内存空间的指针,在退出子程序时需要使用Nullify语句解除指针与目标之间的关联。
那么在子程序中,有些指针指向了带target属性的变量。
在退出子程序前,这些指针是否也有必要使用Nullify语句解除关联?

问题2:
假定有一个指针函数如下:
      Function PointOfFrameworkSite(Iselect)

      Integer, Intent(In) :: Iselect
      Type(Type_Sites), Dimension(:), Pointer :: PointOfFrameworkSite

      Select Case(Iselect)
          Case(1)
                PointOfFrameworkSite => Framework%Site
          Case(2)
                PointOfFrameworkSite => Framework%OpenMetalSite
          Case Default
                Write(*,*) "Unknown SBU Type"
      End select

      Return
      End Function PointOfFrameworkSite

然后在某个模块下的内部子程序中,需要使用这个指针函数(已使用use调用指针函数所在的模块)
那么如果A也是指针
       A => PointOfFrameworkSite(I)
       A =   PointOfFrameworkSite(I)
这两种写法哪种更好


vvt 发表于 2014-5-17 06:44:50

问题1:
1. Nullify 只是设置指针的状态为空,并不释放allocate分配的内存。你应该在退出子程序时使用 Deallocate,否则容易内存泄露
2. 指向 target 属性变量的指针,不能 Deallocate,不必 nullify。

问题2:
那种写法更好,要综合考虑。

要看 Type_Sites 结构是否很大?
如果很大, => 效率可能更高。否则 => 和 = 差别不大。

另外,PointOfFrameworkSite 中的 Framework 在那个函数内定义和存储?是否动态分配的?如何释放?
如果是动态分配的,=> 则容易出错,比如已经释放而导致 A 指针失效。
A=的话,又容易失去对它的控制。造成内存泄露。

Saphy 发表于 2014-5-17 11:00:33

vvt 发表于 2014-5-17 06:44
问题1:
1. Nullify 只是设置指针的状态为空,并不释放allocate分配的内存。你应该在退出子程序时使用 Deal ...

1. 嗯,问题1那里是我语句使用错误了,感谢指正

2. 那个指针函数是放在一个单独的模块里,使用use调用Framework这个变量。
    Framework是一个几乎所有子程序都需要调用的全局变量,它被单独放在一个模块中定义,需要调用它的子程序使用use引用该模块。
    Framework%Site和Framework%OpenMetalSite是设定为动态分配的,在程序的某些步骤中进行分配和释放。

vvt 发表于 2014-5-17 11:23:36

如果您能控制,A 有效的时间里,Framework%Site 和 Framework%OpenMetalSite 也有效。那么用 => 更好

pasuka 发表于 2014-5-18 14:54:12

subroutine或function现在也支持传入可分配数组,所以真有必要上指针吗?
页: [1]
查看完整版本: Fortran指针和指针函数的问题