0

我想获取数组指针的地址。原型代码如下:

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

我的最终目标是通过数组指针的地址获取awith的地址,因为它是 type(foo) 的第一部分。type(foo)aii

提前致谢!

4

2 回答 2

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
于 2012-09-27T02:33:49.313 回答
0

你不能,反正不使用标准的 Fortran。

请注意,您的期望是错误的。

loc是一个扩展。它的作用是特定于处理器的,但通常它会为您提供参数所代表的数据对象地址的整数表示。(F2003 标准的 C_LOC 大致相当。)。在这种情况下,数据对象是一个可分配的数组。在我知道的所有处理器中,该数组的存储不在托管可分配组件的派生类型对象的存储中。派生类型对象只包含一个描述数组存储位置(以及它有多大等)的描述符,而不是数组本身的存储。

于 2012-09-27T02:40:41.437 回答