Arrays 指针数组

Arrays 指针数组,arrays,pointers,fortran,fortran90,Arrays,Pointers,Fortran,Fortran90,我试图实现一个指针数组,这样我就可以在元素上循环。但是,我不确定如何正确执行此操作: TYPE(domain),POINTER :: d01,d02,d03 TYPE(domain),DIMENSION(:),POINTER :: dom ... dom(1) => d01 dom(2) => d02 dom(3) => d03 ... 然后: ... IF(ASSOCIATED(dom(2),d02))THEN ... 编译器(x86-64 L

我试图实现一个指针数组,这样我就可以在元素上循环。但是,我不确定如何正确执行此操作:

TYPE(domain),POINTER              :: d01,d02,d03
TYPE(domain),DIMENSION(:),POINTER :: dom
...

dom(1) => d01
dom(2) => d02
dom(3) => d03
...
然后:

...
IF(ASSOCIATED(dom(2),d02))THEN
...
编译器(x86-64 Linux上的pgf90 10.6-0 64位目标-tp伊斯坦布尔-64)向我发出以下错误消息:

 PGF90-S-0074-Illegal number or type of arguments to associated - keyword argument pointer (test_ptr.f90: 10)
  0 inform,   0 warnings,   1 severes, 0 fatal for MAIN
据我所知,我如何对指针数组进行子集划分是有问题的。
dom(2)
d02
都是秩0(标量指针)。正确的方法是什么


谢谢。

是的,指针数组在Fortran中很有趣

问题在于:

TYPE(domain),DIMENSION(:),POINTER :: dom
并不像您所想的那样定义指针数组,而是定义指向数组的指针。在Fortran中,你可以用这些东西做很多很酷的事情——指向大数组的切片,甚至是跨步——但它肯定是指向数组的指针,而不是指针数组

在Fortran中获取指针数组的唯一方法是定义类型:

type domainptr
  type(domain), pointer :: p
end type domainptr

type(domainptr), dimension(3) :: dom

dom(1)%p => d01
dom(2)%p => d02
dom(3)%p => d03

等等。据我所知,用Fortran做这件事的唯一真正原因是语法。我很想在标准的更高版本中看到这一点。

是的,指针数组在Fortran中很有趣

问题在于:

TYPE(domain),DIMENSION(:),POINTER :: dom
并不像您所想的那样定义指针数组,而是定义指向数组的指针。在Fortran中,你可以用这些东西做很多很酷的事情——指向大数组的切片,甚至是跨步——但它肯定是指向数组的指针,而不是指针数组

在Fortran中获取指针数组的唯一方法是定义类型:

type domainptr
  type(domain), pointer :: p
end type domainptr

type(domainptr), dimension(3) :: dom

dom(1)%p => d01
dom(2)%p => d02
dom(3)%p => d03

等等。据我所知,用Fortran做这件事的唯一真正原因是语法。我很想在标准的后续版本中看到这一点。

谢谢乔纳森,这是一个很好的答案。谢谢乔纳森,这是一个很好的答案。