Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran结构指针_Fortran_Gfortran - Fatal编程技术网

Fortran结构指针

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

我有一个问题,分配一个指向结构的指针,一个指向结构的指针。 我使用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
程序测试\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的关联这很有效!。