我正在尝试破译 Fortran 代码。它将指向函数的指针作为实际参数传递,而形式参数则是目标。它在主程序中定义并分配一个 globalDATA 类型的指针,然后调用一个传递该指针的函数:
module dataGLOBAL
type globalDATA
type (gl_1) , pointer :: gl1
type (gd_2) , pointer :: gd2
type (gdt_ok) , pointer :: gdtok
...
...
end type globalDATA
end module dataGLOBAL
Program main
....
....
use dataGLOBAL
...
type(globalDATA),pointer :: GD
allocate(GD)
returnvalue = INIT(GD)
....
....
end
该函数如下:
integer function INIT(GD) result(returnvalue)
....
....
use dataGLOBAL
type(globalDATA) , target :: GD
allocate (GD%gl1)
allocate (GD%gd2)
allocate (GD%gdtok)
....
....
end function INIT
这样做有什么意义呢?为什么主程序中的指针和目标结构体的单个组件都必须分配?
谢谢
A。
有些事情可能会发挥作用......
当您提供一个指针作为过程的实际参数时,其中相应的虚拟参数没有 POINTER 属性(此处的情况),与虚拟参数关联的事物是实际参数指针的目标。所以在这种情况下,传递的对象是GD
(在主程序中)指向 - 由 allocate 语句分配的东西。 (当实际参数和虚拟参数都具有 POINTER 参数时,则 POINTER 本身被“传递” - 您可以更改 POINTER 指向的内容,并且该更改会反映在调用范围中。)
因为GD
函数内部的虚拟参数具有目标属性,函数内部的指针可以指向虚拟参数。您没有显示此类指针的任何声明,但它们可能位于省略的代码中。如果nothing曾经指向GD
虚拟参数(包括在 INIT 函数可能调用的任何过程中),则 TARGET 属性是多余的,但除了抑制某些优化之外无害。
具有指针属性的事物也(根据语言规则自动)具有 TARGET 属性 - 所以GD
在主程序中有TARGET属性。事实是GD
在主程序和函数中都有目标属性可能是相关的,因为......
当虚拟参数具有 TARGET 属性并且作为实际参数传递的事物具有 TARGET 属性时,与过程内的虚拟参数关联的指针也是“通常”的(对于共同索引的事物/非连续的事物存在例外/处理器依赖性)数组/向量下标部分太复杂了,我记不住)与相应的实际参数相关联。如果指针不是局部变量(可能是在模块中声明的指针),则该关联在过程结束后仍然存在。也许这与省略的代码相关。 (或者,如果实际参数没有 TARGET 属性,则当过程结束时与虚拟参数关联的任何指针都将变为未定义。)
的组成部分globalDATA
类型本身就是指针。最后,GD
在主程序中是一个指向某些东西(由主程序中的单个 ALLOCATE 语句分配的东西)的指针,它本身包含指向其他东西的指针(那些其他东西由函数中的众多 ALLOCATE 语句分配)。您有两级指针,因此有两级分配。
在 Fortran 2003(或具有“可分配 TR”的 Fortran 95)之前,您不能在派生类型中拥有 ALLOCATABLE 组件,也不能拥有 ALLOCATABLE 虚拟参数 - 当动态分配的需要与这些以前的限制发生冲突时,您必须使用而是使用指针,即使您仅使用指针作为值。我强烈怀疑你的代码来自这个时代(对可分配 TR 的支持大约十年前变得广泛)。在非常“现代”的 Fortran 中,指针(应该?)仅在您可能需要指向其他事物的变量时使用(其中其他事物包括“无事物”)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)