Sky*_*eSM 3 fortran pointers memory-management fortran90
如果我分配一个F90指针会发生什么:
real, pointer :: abc(:)
allocate abc (nx*ny*nz)
Run Code Online (Sandbox Code Playgroud)
我将abc传递给子程序,在那里我将其重新定义为
real arg1(nx,ny,xz)
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常.
但如果我重新定义为2D数组,我会得到一个段错误.
real arg1(nx,ny)
Run Code Online (Sandbox Code Playgroud)
使用上面重新排序的数组,它应该工作.为什么会失败?任何帮助将不胜感激.
谢谢.
它失败了,因为你正在向编译器说谎数组的大小.
在Fortran 77中,人们过去经常使用这些技巧,因为没有选择.在我们目前的开明时代,我们永远不应该做这些伎俩 - 只有Fortran77和C程序员不得不诉诸这种技巧.
根据fortran中更改数组维度的答案,如果要调整数组大小,或者只是使用不同的形状创建对它的引用,则可以使用RESHAPE
内部函数,或使用数组指针.