Fortran Coder

标题: 有人发文说Fortran没有指针数组的概念?有人能解答吗? [打印本页]

作者: navoski    时间: 2021-6-21 10:39
标题: 有人发文说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”。



原码:
  
[Fortran] 纯文本查看 复制代码
!================== 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

修改后的代码:
[Fortran] 纯文本查看 复制代码
!================== 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
type(person) :: pt(5)
pt(1)%p => 张三
pt(2)%p => 罗翔
作者: navoski    时间: 2021-6-22 13:02
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
数组指针:指向数组的指针,不能指定数组大小,如 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
li913 发表于 2021-6-26 12:36
数组指针:指向数组的指针,不能指定数组大小,如 type(person), pointer:: p(:)
指针数组:指向某种数据结 ...

谢谢啦~   有你们这些热心的领路人解惑,真好!




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2