FangPlus7904 发表于 2024-12-8 16:46:25

请教,Fortran指针数组的问题

想实现用一个指针数组指向自定义类型的某个属性,然后进行其他操作,但是用下面的案例有个错误。
test.f90:30:2:

   ages(i) => persons(i)%age
1
Error: Expected bounds specification for 'ages' at (1)
再线求助


program pointer_to_attribute
    implicit none
        ! 定义Person类型
        type :: Person
                integer :: age
                real :: height
                real :: weight
                character(len=20) :: name
        end type Person
   ! 声明Person类型的数组,包含5个元素
    type(Person) :: persons(5)
   ! 声明一个指针数组,用来指向persons数组中每个元素的age属性
    integer, pointer :: ages(:)
    integer :: i

   ! 初始化persons数组中的元素
    do i = 1, 5
      persons(i)%age = 20 + i
      persons(i)%height = 1.70 + real(i) / 10.0
      persons(i)%weight = 60.0 + real(i) * 2.0
      write(persons(i)%name, '(A, I1)') 'Person ', i
    end do

   ! 让指针数组ages指向persons数组中每个元素的age属性
    allocate(ages(5))
       
        do i=1,5
                ages(i) => persons(i)%age
        end do

   ! 输出通过指针访问到的年龄信息,验证是否正确指向
    do i = 1, 5
      print *, 'Person ', i, ' age (via pointer): ', ages(i)
    end do

   ! 释放指针数组所占用的内存空间
    deallocate(ages)

end program pointer_to_attribute

Transpose 发表于 2024-12-8 20:27:21

本帖最后由 Transpose 于 2024-12-8 20:32 编辑

allocate了age再=>就内存泄漏了
另外Fortran的数组指针只能指向数组或者数组切片
    ages=>persons(:)%age

不知道这么写符合标准不,倒是没报错

楚香饭 发表于 2024-12-9 08:39:07

本帖最后由 楚香饭 于 2024-12-9 09:00 编辑

integer, pointer :: ages(:)
这是一个指向数组的指针。而不是一个由指针构成的数组。

Fortran 不能直接构建“由指针构成的数组”,非要实现需要用一个
type T_name
real , pointer :: p
end type
type(T_name) :: pnt(:)
来实现指针数组。

指向数组的指针,如果分配的话,和 allocatable 的数组用法类似。
分配后即指向该数组,如果你再 => 指向新的目标,那么已分配的内容就“泄露”了,没有释放且不能再访问。

指向数组的指针,可以直接指向一个数组,而无需分配。
如楼上所说的,合法的途径是直接 ages=>persons(:)%age
页: [1]
查看完整版本: 请教,Fortran指针数组的问题