Fortran结构指针
我有一个问题,分配一个指向结构的指针,一个指向结构的指针。 我使用gfortran 4.6.3,文件名为test_pointer_struct.f08,因此我使用的是Fortran 2008标准(由gfortran 4.6.3支持) 赫拉来了密码:Fortran结构指针,fortran,gfortran,Fortran,Gfortran,我有一个问题,分配一个指向结构的指针,一个指向结构的指针。 我使用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
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
程序测试\u指针\u结构
类型tSmall
整数::a
双精度::b
端型tSmall
tBig型
整数::h
类型(tSmall),指针::成员\小
端型tBig
类型(待定)::变量
类型(tSmall),指针::var_small(:)
! 我们得到一个指向这个小结构的指针数组
分配(var_small(3))
! 同时分配成员\u小结构(不是数组)
分配(变量大%成员小)
变量\u大%成员\u小%a=1
变量大%member小%b=2.0
! 现在我们需要一个指针var_samall数组的元素,指向member_big中的member_small
var_small(1)=>var_big%成员_small!NULL()
结束程序测试\u指针\u结构
当我完成此操作时,会出现以下错误:
错误:这是一个特殊的“小型”工程(1)
可以翻译为
错误:在(1)处的“var_small”应为极限规格
这个错误是什么意思?。我做错了什么
事先非常感谢。Fortran实际上不做指针数组。你的声明
type(tSmall), pointer :: var_small(:)
不将var_small
定义为指向tsmall
类型事物的指针数组;相反,它将其定义为指向tsmall
类型的数组的指针
当我编译你的代码时,英特尔Fortran给出了更有用的错误信息
此数据指针分配的语法不正确:或“绑定”
在此上下文中应为“规范”或“绑定重新映射”
这将我们带到Fortran 2003标准中的R735。编译器尝试解析var_small(1)
而不是像您希望的那样,作为指针数组中第一个元素的引用,而是边界规范列表或边界重新映射列表。表达式的语法不正确,因此解析失败
这就是错误的含义。你怎么办?这取决于你的意图。通常的建议是按照以下思路定义一个派生类型
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()解除成员_small的关联这很有效!。