Fortran 90阵列通过引用问题传递

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)

使用上面重新排序的数组,它应该工作.为什么会失败?任何帮助将不胜感激.

谢谢.

Jon*_*rsi 5

它失败了,因为你正在向编译器说谎数组的大小.

在Fortran 77中,人们过去经常使用这些技巧,因为没有选择.在我们目前的开明时代,我们永远不应该做这些伎俩 - 只有Fortran77和C程序员不得不诉诸这种技巧.

根据fortran中更改数组维度的答案,如果要调整数组大小,或者只是使用不同的形状创建对它的引用,则可以使用RESHAPE内部函数,或使用数组指针.