fortran - 本地初始化变量规则也适用于指针吗?

标签 fortran fortran90 gfortran fortran95

我知道在初始化本地声明的变量( 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/

相关文章:

gcc - 如何使用 CMake 和 Gfortran 错误读取 stracktrace

fortran - LAPACK 反演例程奇怪地混合了所有变量

arrays - 大型动态数组 Fortran 声明段错误

compiler-errors - 为什么在编译时MinGW无法识别我的目标文件?

linux - Bin 数据在 AIX 和 Linux 中的读取方式不同

fortran - 在 Fortran 主文件头中包含 .f 和 .F90 文件

compiler-errors - 如何在 (1)"处调试 Fortran 90 编译错误 "There is no specific subroutine for the generic ' foo'?

module - 模块何时超出 Fortran 90/95 的范围?

string - 当虚拟对象具有指定长度时将字符串作为参数传递

c - 无法链接到 libgfortran.a