我正在尝试破译 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
这样做的意义何在?为什么必须分配主程序中的指针和目标结构的单个组件?
谢谢
一种。
最佳答案
一些事情可能会起作用......
GD
(在主程序中)指向的对象 - 由分配语句分配的对象。 (当实际参数和虚拟参数都具有 POINTER 参数时,则 POINTER 本身被“传递” - 您可以更改 POINTER 指向的内容,并且该更改会反射(reflect)在调用范围中。) GD
伪参数具有 target 属性,所以函数内部的指针可以指向伪参数。您没有显示此类指针的任何声明,但也许它们在省略的代码中。如果 没有任何 指向 GD
虚拟参数(包括在可能被 INIT 函数调用的任何过程中),那么 TARGET 属性是多余的,但除了抑制某些优化之外无害。 GD
具有 TARGET 属性。主程序和函数中的 GD
都具有 target 属性这一事实可能是相关的,因为... globalDATA
类型的组件本身就是指针。因此,主程序中的 GD
是一个指向某物(由主程序中的单个 ALLOCATE 语句分配的某物)的指针,它本身包含指向其他事物(由函数中的众多 ALLOCATE 语句分配的那些其他事物)的指针。您有两级指针,因此有两级 ALLOCATE。 关于function - Fortran 函数 : pointer as actual argument and target as formal,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14188798/