如果我分配一个F90指针会发生什么:
real, pointer :: abc(:)
allocate abc (nx*ny*nz)
我将abc传递给子程序,我将其重新定义为
real arg1(nx,ny,xz)
这似乎工作正常。
但如果我重新定义为2D数组,我会遇到段错误。
real arg1(nx,ny)
使用上面重新排序的数组,它应该工作。为什么会失败?任何帮助将不胜感激。
感谢。
答案 0 :(得分:5)
它失败了,因为你正在向编译器说谎数组的大小。
在Fortran 77中,人们过去常常使用这些技巧,因为没有选择。在我们目前的开明时代,我们永远不应该做这些伎俩 - 只有Fortran77和C程序员不得不采用这种技巧。
根据changing array dimensions in fortran的答案,如果要调整数组大小,或者只是使用不同的形状创建对它的引用,可以使用RESHAPE
内在函数,或者使用数组指针
答案 1 :(得分:3)
我真的不明白你的问题,你应该做什么,因为在这种情况下只传递对数组的引用。
program test
integer :: nx, ny
real, pointer :: abc(:)
nx = 2
ny = 3
allocate(abc(nx**3))
call my_sub(abc, nx, ny)
write(*,*) abc
end program
subroutine my_sub(abc, nx, ny)
integer :: nx, ny
real :: abc(nx,ny)
abc = 1.0
end subroutine
要了解数组的传递方式,您可以阅读this页面。在底部,您可以找到可能情况的表格。这里左下角的情况适用。