【问题标题】:Fortran 90 array pass by reference issueFortran 90 数组按引用传递问题
【发布时间】:2012-02-13 19:52:44
【问题描述】:

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

real, pointer :: abc(:)

allocate abc (nx*ny*nz)

我将 abc 传递给一个子程序,在这里我将其重新定义为

real arg1(nx,ny,xz)

这似乎工作正常。

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

real arg1(nx,ny)

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

谢谢。

【问题讨论】:

  • @SethCarnegie:我们每天在这里得到(并回答)大约 2 个...
  • 感谢您的回答。结果证明该错误与数组重新定义问题完全无关。

标签: pointers memory-management fortran fortran90


【解决方案1】:

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

在 Fortran 77 中,人们过去一直使用这些技巧,因为没有选择。在我们这个开明的时代,我们不应该做这些花招——只有 Fortran77 和 C 程序员才不得不诉诸这种诡计。

根据changing array dimensions in fortran 的答案,如果您想调整数组的大小,或者只是用不同的形状创建对它的引用,您可以使用RESHAPE 内在函数,或使用数组指针。

【讨论】:

  • 感谢您的回答。错误只是在其他地方,但我现在知道数组重新定义是如何工作的。谢谢。
【解决方案2】:

我不太明白你的问题,你应该做什么,因为在这种情况下,只传递了对数组的引用。

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

【讨论】:

  • 这就是将这些数组传递给 intel 编译器的方式,实际上这些很可能是实现;但是该标准对此并不能保证任何事情;如果编译器供应商认为在某些情况下(例如)在堆栈上传递小数组复制输入/复制输出是有利的,则可以免费这样做。
  • @steabert:感谢您的回答。由于我也在使用 icc,因此该链接非常适合阅读。
猜你喜欢
  • 2016-12-15
  • 2011-01-29
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
  • 2015-12-09
相关资源
最近更新 更多