Fortran指向结构的指针

安东尼奥·塞拉诺(Antonio Serrano)

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

Hera附带了以下代码:

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

当我对此进行解释时,会出现以下错误:错误:esperpera unaespecificacióndelímites段'var_small'zh(1)可以翻译为错误:(1)预期'var_small'的极限规格

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

提前非常感谢您。

高性能标志

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

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

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

当我编译您的代码时,Intel Fortran会给出更有用的错误消息

数据指针分配的语法不正确:在这种情况下,可能需要“绑定规范”或“绑定重新映射”。

这使我们进入了Fortran 2003标准中的R735。编译器尝试var_small(1)不按您的意愿将其解析为对指针数组中第一个元素的引用,而是对bounds-spec-listbounds-remapping-list的引用该表达式都没有正确的语法,并且解析失败。

这样就解决了错误意味着什么的问题。你对此怎么办?那取决于你的意图。通常的建议是按照以下方式定义派生类型

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

然后使用这些数组

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章