Fortran Coder

查看: 9649|回复: 4

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

[复制链接]

13

帖子

4

主题

0

精华

入门

F 币
88 元
贡献
52 点
发表于 2021-6-21 10:39:02 | 显示全部楼层 |阅读模式
本帖最后由 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

790

帖子

2

主题

0

精华

大宗师

F 币
3765 元
贡献
2255 点
发表于 2021-6-22 11:34:35 | 显示全部楼层
type(person) :: pt(5)
pt(1)%p => 张三
pt(2)%p => 罗翔

13

帖子

4

主题

0

精华

入门

F 币
88 元
贡献
52 点
 楼主| 发表于 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不存在指针数组的概念,只存在数组指针的概念?

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

790

帖子

2

主题

0

精华

大宗师

F 币
3765 元
贡献
2255 点
发表于 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

13

帖子

4

主题

0

精华

入门

F 币
88 元
贡献
52 点
 楼主| 发表于 2021-6-26 21:46:01 | 显示全部楼层
li913 发表于 2021-6-26 12:36
数组指针:指向数组的指针,不能指定数组大小,如 type(person), pointer:: p(:)
指针数组:指向某种数据结 ...

谢谢啦~   有你们这些热心的领路人解惑,真好!
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-3-29 18:28

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表