navoski 发表于 2021-6-21 10:39:02

有人发文说Fortran没有指针数组的概念?有人能解答吗?

本帖最后由 navoski 于 2021-6-22 12:48 编辑

有人发文说Fortran没有指针数组的概念(http://blog.sciencenet.cn/blog-517015-679554.html),“Fortran不存在指针数组的概念,不能直接使用指针数组,必须通过一个包含指针的数据类型(如下)来定义数组,其效果等同于"指针数组"。”。
我重新码了一遍,居然可以通过。那到底是谁正确呢?还是说“Fortran不存在指针数组的概念”,是指不能采用直接指定数组大小的方式声明指针数组?我type(person), pointer :: pt(5)时,报错“!Error: Array pointer 'pt' at (1) must have a deferred shape or assumed rank”。



原码:
!================== module func ===========================
module func
    type person
      character(len = 10)   :: name
      real                  :: height, weight
    end type person
   
    type pperson
      type(person), pointer :: p
    end type pperson
   
    contains
   
    subroutine sort(p)
      implicit none
      type(pperson)    :: p(:)
      type(pperson)    :: temp
      integer          :: i, j, s
      
      s = size(p, 1)
      do i = 1, s-1
            do j = i+1, s
                if (p(i)%p%height < p(j)%p%height) then
                  temp = p(i)
                  p(i) = p(j)
                  p(j) = temp
                end if
            end do
      end do
!      return
    end subroutine sort
end module func

!================ main program ==============================
program examSort
use func
implicit none
   
    type(person), target :: p(5) = [person('chen', 180.0, 75.0), &
                                    person('huang', 170.0, 65.0), &
                                    person('liu', 175.0, 80.0), &
                                    person('cai', 182.0, 78.0), &
                                    person('xu', 178.0, 70.0) ]
    type(pperson)       :: pt(5)
    integer             :: i
    forall (i=1:5)
      pt(i)%p => p(i)
    end forall
   
    call sort(pt)
   
    write(*, '(5(a8, f6.1, f5.1, /))') (pt(i)%p, i=1,5)
   
                                    
end program examSort
修改后的代码:
!================== module func ===========================
module func
    type person
      character(len = 10)   :: name
      real                  :: height, weight
    end type person
   
!    type pperson
      type(person), pointer :: p
!    end type pperson
   
    contains
   
    subroutine sort(p)
      implicit none
!      type(pperson)    :: p(:)
!      type(pperson)    :: temp
      type(person), pointer :: p(:)
      type(person), pointer :: temp
      integer          :: i, j, s
      
      s = size(p, 1)
      print *, 's', s
      do i = 1, s-1
            do j = i+1, s
!                if (p(i)%p%height < p(j)%p%height) then
                if (p(i)%height < p(j)%height) then
                  temp = p(i)
                  p(i) = p(j)
                  p(j) = temp
                end if
            end do
      end do
!      return
    end subroutine sort
end module func

!================ main program ==============================
program examSortTestArrayPointer
use func
implicit none
   
    type(person), target :: a(5) = [person('chen', 180.0, 75.0), &
                                    person('huang', 170.0, 65.0), &
                                    person('liu', 175.0, 80.0), &
                                    person('cai', 182.0, 78.0), &
                                    person('xu', 178.0, 70.0) ]
!    type(pperson)       :: pt(5)
!Error: Array pointer 'pt' at (1) must have a deferred shape or assumed rank
!    type(person), pointer :: pt(5)
    type(person), pointer :: pt(:)
    integer             :: i
!    forall (i=1:5)
!      pt(i) => p(i)
!    end forall
    pt => a
   
    call sort(pt)
   
!    write(*, '(5(a8, f6.1, f5.1, /))') (pt(i)%p, i=1,5)
    write(*, '(5(a8, f6.1, f5.1, /))') (pt(i), i=1,5)
                                    
end program examSortTestArrayPointer

li913 发表于 2021-6-22 11:34:35

type(person) :: pt(5)
pt(1)%p => 张三
pt(2)%p => 罗翔

navoski 发表于 2021-6-22 13:02:20

li913 发表于 2021-6-22 11:34
type(person) :: pt(5)
pt(1)%p => 张三
pt(2)%p => 罗翔

person 不是指针,你的意思是type(pperson) :: pt(5)吧,这是可以的。

另外,《FORTRAN FOR SCIENTISTS AND ENGINEERS, FOURTH EDITION》p707 “A pointer to an array must declare the type and the rank of the array that it will point to, but does not declare the extent in each dimension. ”所以不能采用直接指定数组大小的方式声明指针数组。

我的问题是如果定义了数据类型type person, 能直接用type(person), pointer :: pt(:)声明数组指针吗?
进而能否确认fortran不存在指针数组的概念,只存在数组指针的概念?

也可能是我没有明白你的意思,关于我的问题,能解释得详细些吗?

li913 发表于 2021-6-26 12:36:36

数组指针:指向数组的指针,不能指定数组大小,如 type(person), pointer:: p(:)
指针数组:指向某种数据结构的多个指针的集合(Fortran没有,可通过type间接实现),指针的个数等于数组size,如 type(pperson), pointer:: p(5)
参考https://www.bilibili.com/video/BV1XD4y1S7jz?p=5

navoski 发表于 2021-6-26 21:46:01

li913 发表于 2021-6-26 12:36
数组指针:指向数组的指针,不能指定数组大小,如 type(person), pointer:: p(:)
指针数组:指向某种数据结 ...

谢谢啦~   有你们这些热心的领路人解惑,真好!
页: [1]
查看完整版本: 有人发文说Fortran没有指针数组的概念?有人能解答吗?