2012-02-13 29 views
3

如果我因此分配一个F90指针会发生什么:Fortran 90的阵列通过引用传递问题

real, pointer :: abc(:) 

allocate abc (nx*ny*nz) 

我通过ABC到子程序,其中,i重新定义它为

real arg1(nx,ny,xz) 

这似乎是工作精细。

但是,如果我重新定义为二维数组,我得到一个段错误。

real arg1(nx,ny) 

随着重新排序阵列如上,它应该工作。它为什么会失败?任何帮助将不胜感激。

谢谢。

+0

@SethCarnegie:我们获得(和答案)2日在这里SO ... – 2012-02-13 20:16:38

+0

谢谢您的解答。这个错误与数组重定义问题完全无关。 – SkypeMeSM 2012-02-13 21:46:12

回答

5

它,因为你说谎有关数组的大小,编译器失败。

在Fortran 77的,人们习惯使用的招数所有的时间,因为没有选择。在我们目前的开明时代,我们绝不应该做这些技巧 - 只有Fortran77和C程序员不得不采用这种欺骗手段。

根据changing array dimensions in fortran的回答,如果要调整数组大小,或者只是使用不同的形状创建引用,则可以使用内部函数或使用数组指针。

+0

谢谢你的回答。这个错误只是在其他地方,但我现在知道阵列重新定义是如何工作的。谢谢。 – SkypeMeSM 2012-02-13 21:49:25

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

+2

这就是为intel编译器传递这些数组的方法,事实上这些都很可能实现;但标准并不保证任何关于此的内容;如果一个编译器供应商认为它在某些情况下有利于(例如)通过小阵列复制/复制到堆栈上,那么可以自由地做到这一点。 – 2012-02-13 20:48:26

+0

@steabert:谢谢你的回答。因为我也使用icc,所以链接是一个很棒的阅读。 – SkypeMeSM 2012-02-13 21:47:52