我想获取数组指针的地址。原型代码如下:
program main
implicit none
type foo
integer, allocatable :: i(:)
integer j
end type
type(foo) a
integer, pointer :: ai(:)
ai => a%i
print *, "The address of a is ", loc(a)
print *, "The address of a%i is", loc(ai) ! <--- I expect the same address as a.
end program main
我的最终目标是通过数组指针a
的地址获取type(foo)
ai
的地址,因为i
是类型的第一部分(foo)。
提前致谢!
立
答案 0 :(得分:1)
Fortran不保证用户定义的第一项与该用户定义的类型相同。也许在项目之前有一个标题。也许有一些填充。也许编译器以不同的顺序存储项目。也许不同的编译器会做不同的事情。这些都没有指定。所以你的期望可能不会发生。 Fortran几乎不需要地址。你想做什么?如果您与C接口,则ISO_C_Binding提供C_LOC。
编辑回应评论。如果您的目标是通过省略前导“a%”来简化变量名称,则可以使用指针创建访问同一存储的备用变量。您不必尝试使用指针来超越语言。例如:
program main
implicit none
type foo
integer, pointer :: i(:)
integer j
end type
type(foo) a
integer, pointer :: ai(:)
allocate ( a%i (5) )
a%i = [ 2, 5, 1, 3, 9 ]
ai => a%i
write (*, '( "a%i=", 5(2X,I2) )' ) a%i
write (*, '( "ai=", 5(2X,I2) )' ) ai
end program main
输出是:
a%i= 2 5 1 3 9
ai= 2 5 1 3 9
答案 1 :(得分:0)
你不能,也不能使用标准的Fortran。
请注意,您的期望是错误的。
loc
是一个扩展名。它的作用是特定于处理器,但通常它会为您提供参数所代表的数据对象的地址的整数表示。 (F2003标准的C_LOC大致相当。)。在这种情况下,数据对象是可分配的数组。在我知道的所有处理器中,该阵列的存储不在托管可分配组件的派生类型对象的存储中。派生类型对象只包含一个描述符,该描述符描述数组的存储位置(以及它的大小等),而不是数组本身的存储空间。