Pointers Fortran 90数组按引用传递问题

Pointers Fortran 90数组按引用传递问题,pointers,memory-management,fortran,fortran90,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) 对于如上所述的重新排序的数组,它应该可以工作。为什么会失败?任何帮助都将不胜感激 谢谢。它失败了,因为你在数组大小问题上对编译器撒谎 在Fortran 77中,人们总是

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

real, pointer :: abc(:)

allocate abc (nx*ny*nz)
我将abc传递给一个子例程,在那里我将其重新定义为

real arg1(nx,ny,xz)
这似乎很有效

但如果我重新定义为2D数组,我会得到一个错误

real arg1(nx,ny)
对于如上所述的重新排序的数组,它应该可以工作。为什么会失败?任何帮助都将不胜感激


谢谢。

它失败了,因为你在数组大小问题上对编译器撒谎

在Fortran 77中,人们总是使用这些技巧,因为没有选择。在我们这个开明的时代,我们永远不应该做这种把戏——只有Fortran77和C程序员不得不诉诸于这种诡计


根据的答案,如果您想调整数组的大小,或者只是创建一个具有不同形状的数组引用,您可以使用
重塑
内在属性,或者使用数组指针。

我不太理解您的问题,您应该做些什么,因为在这种情况下,只传递对数组的引用

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

要了解数组是如何传递的,可以阅读第页。在底部,你可以找到一个可能的情况表。这里是左下角的例子。

@SethCarnegie:我们每天得到(和回答)大约2个,所以…谢谢你的回答。这个错误与数组重新定义问题完全无关。这就是那些数组被传递给英特尔编译器的方式,事实上,这些都是很可能的实现;但是标准并不能保证这一点;如果编译器供应商认为在某些情况下(比如)在堆栈上传递小数组的复制输入/复制输出是有利的,那么可以自由地这样做。@steabert:谢谢你的回答。因为我也在使用icc,所以这个链接读得很好。谢谢你的回答。错误只是在别处,但我现在知道数组重新定义是如何工作的了。谢谢