有人发文说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
type(person) :: pt(5)
pt(1)%p => 张三
pt(2)%p => 罗翔 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不存在指针数组的概念,只存在数组指针的概念?
也可能是我没有明白你的意思,关于我的问题,能解释得详细些吗?
数组指针:指向数组的指针,不能指定数组大小,如 type(person), pointer:: p(:)
指针数组:指向某种数据结构的多个指针的集合(Fortran没有,可通过type间接实现),指针的个数等于数组size,如 type(pperson), pointer:: p(5)
参考https://www.bilibili.com/video/BV1XD4y1S7jz?p=5 li913 发表于 2021-6-26 12:36
数组指针:指向数组的指针,不能指定数组大小,如 type(person), pointer:: p(:)
指针数组:指向某种数据结 ...
谢谢啦~ 有你们这些热心的领路人解惑,真好!
页:
[1]