gpt4 book ai didi

fortran - 将派生类型的指针分配给 Fortran 中相同类型的目标

转载 作者:行者123 更新时间:2023-12-02 18:46:02 25 4
gpt4 key购买 nike

我想在包含在同一派生类型中的派生类型中分配一个指针。下面的代码给了我下面的错误。这是怎么回事,我该如何解决?

   24 |         zoos(i)%tigers(1) => zoos(i)%animals(1, 1)
| 1
Error: Expected bounds specification for 'zoos' at (1)
module mo_zoo
implicit none
type zoo
integer, dimension(:,:), pointer :: animals
integer, dimension(:), pointer :: tigers
integer, dimension(:), pointer :: ducks
end type zoo

save
type(zoo), dimension(:), pointer :: zoos
end module mo_zoo

program test
use mo_zoo
implicit none
integer :: n_zoos
integer :: i

n_zoos = 4
allocate(zoos(n_zoos))

do i = 1, n_zoos
allocate(zoos(i)%animals(10, 2))
zoos(i)%tigers(1) => zoos(i)%animals(1, 1)
zoos(i)%ducks(1) => zoos(i)%animals(1, 2)
end do
end program test

最佳答案

问题与派生类型无关,报错信息不对。

问题是zoos(i)%ducks是一个指向数组的指针,不是指针数组,所以需要指向zoos(i)%duckszoos(i)%animals(:, 2),而不是 zoos(i)%ducks(1)zoos(i)%animals( 1, 2)

我之前讲过这个in this answer .

我相信这可以满足您的需求:

module mo_zoo
implicit none
type zoo
integer, dimension(:,:), pointer :: animals
integer, dimension(:), pointer :: tigers
integer, dimension(:), pointer :: ducks
end type zoo

save
type(zoo), dimension(:), pointer :: zoos
end module mo_zoo

program test
use mo_zoo
implicit none
integer :: n_zoos
integer :: i

n_zoos = 4
allocate(zoos(n_zoos))

do i = 1, n_zoos
allocate(zoos(i)%animals(10, 2))
zoos(i)%tigers => zoos(i)%animals(:, 1)
zoos(i)%ducks => zoos(i)%animals(:, 2)
end do
end program test

我还想提出一个框架挑战。正如评论中所指出的,尤其是 Ian Bush 所指出的,Fortran 中的指针是出了名的容易出错。

我建议用 allocatable 替换任何已分配的 pointer。这些 allocatable 也必须是 target 如果它们有 pointer 指向它们,就像这样:

module mo_zoo
implicit none
type zoo
integer, dimension(:,:), allocatable :: animals
integer, dimension(:), pointer :: tigers
integer, dimension(:), pointer :: ducks
end type zoo

save
type(zoo), dimension(:), allocatable, target :: zoos
end module mo_zoo

program test
use mo_zoo
implicit none
integer :: n_zoos
integer :: i

n_zoos = 4
allocate(zoos(n_zoos))

do i = 1, n_zoos
allocate(zoos(i)%animals(10, 2))
zoos(i)%tigers => zoos(i)%animals(:, 1)
zoos(i)%ducks => zoos(i)%animals(:, 2)
end do
end program test

在可能的情况下使用 allocatable 而不是 pointer 有很多优点:

  • allocatable 退出范围1 时,allocatable 持有的内存将自动释放。
  • 编译器可以对可分配做出比指针更强的假设,有时会导致更快的代码。

1 至少,根据 Fortran 标准,这是正确的。某些编译器(特别是 this bug)存在几个与终结相关的突出问题。

关于fortran - 将派生类型的指针分配给 Fortran 中相同类型的目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67430363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com