gpt4 book ai didi

fortran - Fortran 中解引用指针的分配

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

我正在尝试在 Fortran 90 中创建一个指针数组,如 here 所述。然后,该数组中的每个指针都与一个 float 数组相关联,以便在运行时通过取消引用指针来分配。请参阅下面的示例:

program test
type ptr
double precision, pointer :: p(:)
end type ptr

integer :: i, n=5
type(ptr), dimension(3) :: ptrs
double precision, pointer :: a(:), b(:), c(:)

ptrs(1)%p => a
ptrs(2)%p => b
ptrs(3)%p => c

do i=1,3
allocate(ptrs(i)%p(n))
ptrs(i)%p = 0d0
enddo

write(6, *) ptrs(1)%p
write(6, *) a

end program test

结果:

$ gfortran -o test test.f90 && ./test                                                                                                 
0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000
At line 20 of file test.f90 (unit = 6, file = 'stdout')
Internal Error: list_formatted_write(): Bad type

抛出错误是因为a未分配。在理想的世界中,ptrs(1)%p 和 a 应该是相同的,但显然这个世界是有缺陷的。我的问题:如何正确分配abc

最佳答案

我建议始终取消您的指针。这样你就不会那么容易遇到由未定义指针引起的未定义行为。

对于派生类型,您可以使用默认初始化

type ptr
double precision, pointer :: p(:) => null()
end type ptr

double precision, pointer :: a(:), b(:), c(:)

指针a指向某个未定义的垃圾地址。

ptrs(1)%p => a

现在ptrs(1)%p指向相同的垃圾地址。

allocate(ptrs(i)%p(n))

现在分配了一个新目标,并且 ptrs(1)%p 指向那里。 a 不受影响。

相反,您现在还必须将 a 指向该新地址。

a => ptrs(1)%p

重要的是不要将 aptrs(1)%p 视为同一事物的两个别名。他们不是。两者都是指针,都指向某个地方。您有责任确保它们始终指向同一地址。

关于fortran - Fortran 中解引用指针的分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61363523/

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