我有一个问题,指向结构的指针,指向结构的指针.我使用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
Run Code Online (Sandbox Code Playgroud)
当我对此进行编译时,我收到以下错误:错误:Se esperabaunaespecificacióndelímitespara'var_small'en(1)可以翻译为错误:限制规范'var_small'在(1)处的预期
这个错误是什么意思?.我究竟做错了什么?
非常感谢你提前.
Fortran并没有真正做指针数组.你的声明
type(tSmall), pointer :: var_small(:)
Run Code Online (Sandbox Code Playgroud)
没有定义var_small为指向类型的东西的指针数组tsmall; 相反,它将它定义为指向类型的数组的指针tsmall.
当我编译您的代码时,英特尔Fortran提供了更有用的错误消息
此数据指针赋值的语法不正确:在此上下文中需要"绑定规范"或"绑定重新映射".
这将我们带入Fortran 2003标准的R735.编译器尝试var_small(1)不根据需要解析指针数组中第一个元素的引用,而是解析bounds-spec-list或bounds-remapping-list.表达式没有正确的语法,解析失败.
因此,这涉及错误意味着什么的问题.你怎么办?这取决于你的意图.通常的建议是沿着这些线定义派生类型
type myptr
type(tsmall), pointer :: psmall
end type myptr
Run Code Online (Sandbox Code Playgroud)
然后使用那些数组
type(myptr), dimension(:), allocatable :: ptrarray
Run Code Online (Sandbox Code Playgroud)
就个人而言,我从来不喜欢这种方法,也从不需要使用它(我编写非常简单的程序).我希望Fortran 2003也有更好的方法,但不知道你的意图,我犹豫提供建议.