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

时间:2012-02-13 19:52:44

标签: pointers memory-management fortran fortran90

如果我分配一个F90指针会发生什么:

real, pointer :: abc(:)

allocate abc (nx*ny*nz)

我将abc传递给子程序,我将其重新定义为

real arg1(nx,ny,xz)

这似乎工作正常。

但如果我重新定义为2D数组,我会遇到段错误。

real arg1(nx,ny)

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

感谢。

2 个答案:

答案 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页面。在底部,您可以找到可能情况的表格。这里左下角的情况适用。