我知道在初始化本地声明的变量( reference )时应该小心。
!这是错误的方式 (声明时初始化的局部变量具有隐式保存属性。)
real function kinetic_energy(v)
real, dimension(:), intent(in) :: v
real :: ke = 0.0
end function kinetic_energy
!这是正确的方法
real function kinetic_energy(v)
real, dimension(:), intent(in) :: v
real :: ke
ke = 0.
end function kinetic_energy
我想知道我们是否也有类似的指针。
real function kinetic_energy(v)
real, dimension(:), intent(in) :: v
real, pointer :: ke => null()
end function kinetic_energy
或
real function kinetic_energy(v)
real, dimension(:), intent(in) :: v
real, pointer :: ke
nullify(ke)
end function kinetic_energy
声明时无效的指针变量将被视为保存属性!
感谢您提供有用的信息。我读过,总是将指针初始化为 NULL,根据你所说的,这可能是完全错误的陈述。例如,我不应该在子例程中初始化本地指针变量! (如果它们在子例程的每个入口处分配给新的大小)我对吗!!!
real function kinetic_energy(v)
real, dimension(:), intent(in) :: v
!local variables
real, dimension(:), pointer :: ke => null()
integer :: n
!
n=size(v,1)
allocate(ke(n))
!make a copy
ke=v
!do some computation ...
end function kinetic_energy
最佳答案
指针和非指针的情况实际上几乎是一样的。 @francescalus 是对的,规则 5.3.16.1
确实讨论了指针目标变得未定义的可能性,但在这里并不重要。当然,如果保存的指针指向短暂的东西,那么在目标不再存在后它就不再有效,但这是很明显的。
但是显式初始化的语义对于指针和非指针是相同的。它暗示了 save
属性。这意味着值或指针关联在过程调用之间保留,因此初始化仅完成一次(您的版本 1 和 3)。如果您想在每次过程调用时分配所需的值,则必须使用正常的可执行赋值,而不是显式初始化表达式或其他可执行语句(您的版本 2 和 4)。
编辑:
关于你的新(最后一个)示例,对我来说,这看起来像是一个使用allocatable
而不是pointer
的地方。它们永远不会未定义,而是以未分配
开始。
如果你需要它作为一个指针,如果你不测试它的关联状态,它仍然不必在分配之前被取消。您始终可以在可执行代码的开头使用 nullify()
。
关于fortran - 本地初始化变量规则也适用于指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21463975/