【问题标题】:Fortran pointers to structures指向结构的 Fortran 指针
【发布时间】:2013-11-20 09:37:01
【问题描述】:

我在分配指向结构的指针和指向结构的指针时遇到问题。 我使用的是 gfortran 4.6.3,文件名是 test_pointer_struct.f08,所以我使用的是 Fortran 2008 标准(由 gfortran 4.6.3 支持)。

赫拉来了代码:

PROGRAM test_pointer_struct

type tSmall
  integer          :: a
  double precision :: b
end type tSmall

type tBig
  integer                   :: h
  type(tSmall), pointer     :: member_small
end type tBig

type(tBig)                  :: var_big
type(tSmall), pointer       :: var_small(:)

! We get an array of pointers to the small structure
allocate(var_small(3))
! Also allocate the member_small strucutre (not an array)
allocate(var_big%member_small)

var_big%member_small%a = 1
var_big%member_small%b = 2.0

! Now we want an element of the var_samall array of pointers, to point to the member_small in member_big
var_small(1) => var_big%member_small    ! <- I get a compilation error here

! And dissasociate the member_small (we still maintain access to memory space through var_small(1)
var_big%member_small => NULL()

END PROGRAM test_pointer_struct

当我遵守这一点时,我收到以下错误: 错误:Se esperaba una especificación de límites para 'var_small' en (1) 可以翻译为 错误:“var_small”在 (1) 处的限制规范

这个错误是什么意思?我做错了什么?

非常感谢您。

【问题讨论】:

    标签: fortran gfortran


    【解决方案1】:

    Fortran 并不真正做指针数组。你的声明

    type(tSmall), pointer       :: var_small(:)
    

    没有将var_small 定义为指向tsmall 类型的指针数组;而是将其定义为指向 tsmall 类型的事物数组的指针。

    当我编译你的代码时,英特尔 Fortran 会给出更有用的错误消息

    此数据指针赋值的语法不正确:要么 'bound 在这种情况下需要规范'或'绑定重新映射'。

    这将我们带到 Fortran 2003 标准中的 R735。编译器尝试将 var_small(1) 解析为指针数组中第一个元素的引用,而不是解析为 bounds-spec-listbounds-remapping -列表。表达式没有正确的语法,解析失败。

    这样就解决了错误意味着什么的问题。你怎么办?这取决于你的意图。通常的建议是按照这些思路定义派生类型

    type myptr
        type(tsmall), pointer :: psmall
    end type myptr
    

    然后使用这些数组

    type(myptr), dimension(:), allocatable :: ptrarray
    

    就我个人而言,我从不喜欢这种方法,也从不需要使用它(我编写了非常简单的程序)。我希望 Fortran 2003 也有更好的方法,但在不知道您的意图的情况下,我会犹豫提供建议。

    【讨论】:

    • 非常感谢。我现在明白了,清楚地知道该怎么做。我声明了一个 tSmall 的可分配数组,然后将它的每个元素与 var_big%member_small 相等,然后使用 var_big%member_small => NULL() 解除 member_small 的关联,这行得通!。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 2012-03-28
    • 1970-01-01
    相关资源
    最近更新 更多