我在将一个指向结构的指针分配给一个指向结构的指针时遇到问题。
我使用 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 especación de límites para 'var_small' en (1)
可以翻译为
错误:'var_small' 的预期限制规范为 (1)
这个错误是什么意思?。我究竟做错了什么?
预先非常感谢您。
Fortran 并不真正处理指针数组。您的声明
type(tSmall), pointer :: var_small(:)
没有定义var_small
是指向某种类型的指针的数组tsmall
;相反,它将它定义为指向类型的数组的指针tsmall
.
当我编译你的代码时,Intel Fortran 给出了更有用的错误消息
此数据指针分配的语法不正确:要么 'bound
在这种情况下,需要使用“spec”或“绑定重新映射”。
这将我们带到 Fortran 2003 标准中的 R735。编译器尝试解析var_small(1)
不是如您所愿,作为对指针数组中第一个元素的引用,而是对边界规范列表 or a 边界重映射列表。该表达式没有正确的语法,因此解析失败。
这就解决了错误意味着什么的问题。你对此有何反应?这取决于你的意图。通常的建议是定义一个派生类型,沿着这些思路
type myptr
type(tsmall), pointer :: psmall
end type myptr
然后使用这些数组
type(myptr), dimension(:), allocatable :: ptrarray
就我个人而言,我从来不喜欢这种方法,也从来不需要使用它(我编写非常简单的程序)。我希望 Fortran 2003 也有更好的方法,但在不知道您的意图的情况下,我犹豫是否提供建议。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)