Fortran指针阵列到多个目标

时间:2014-11-12 10:27:01

标签: pointers fortran

有没有办法在Fortran中指向指向不同目标的数组?

以下代码显示了我想要做的事情,因为第二个关联覆盖了第一个

,因此无法正常工作
implicit none
integer, parameter  :: n = 3
integer, target     :: a(n), b(n)
integer, pointer    :: c(:) => NULL()

a = 4
b = 5

c(1:n) => a(1:n)
c(n+1:2*n) => b(1:n)

c(1:2*n) = 1

print*, a
print*, b

OUTPUT (ifort)
       4           1           1
       1           1           1
OUTPUT (gfortran)
       4           4           4
       1           1           1

并且,任何想法为什么ifort和gfortran在这种情况下表现不同?

1 个答案:

答案 0 :(得分:3)

不,没有简单的方法可以做到这一点,至少就我所见。也许如果你说为什么你试图这样做,有人可能会想出一个合适的答案,例如在我看来派生类型和/或数组构造函数可能是要走的路但没有上下文它是很难说。

至于为什么你得到不同的答案,你访问一个数组越界,所以任何事情都可能发生:

ian@ian-pc:~/test/stack$ cat point.f90
Program point

  implicit none
  integer, parameter  :: n = 3
  integer, target     :: a(n), b(n)
  integer, pointer    :: c(:) => NULL()

  a = 4
  b = 5

  c(1:n) => a(1:n)
  c(n+1:2*n) => b(1:n)

  c(1:2*n) = 1

  print*, a
  print*, b

End Program point
ian@ian-pc:~/test/stack$ nagfor -C=all -C=undefined point.f90
NAG Fortran Compiler Release 5.3.1(907)
[NAG Fortran Compiler normal termination]
ian@ian-pc:~/test/stack$ ./a.out
Runtime Error: point.f90, line 14: Subscript 1 of C (value 1) is out of range (4:6)
Program terminated by fatal error
Aborted (core dumped)

仔细想想行

  c(1:n) => a(1:n)
  c(n+1:2*n) => b(1:n)

正在做。第一行说忘了以前的c,现在c(1:n)是(1:n)的别名。注意c的允许索引从1到n。类似地,第二行抛弃对a的引用,并且表示c(n + 1:2 * n)是b(1:n)的别名。现在注意,C的索引从n + 1:2 * n运行,而对于b,它们从1:n运行,但这很好,因为它们都有n个元素,这一切都很重要。然而,下一行说

 c(1:2*n) = 1

这是不正确的,因为您刚才说C的最低允许索引是n + 1,并且因为n = 3 1不是有效索引。因此,你不受约束,所以任何事情都可能发生。

我强烈建议您在开发时使用编译器上的调试选项 - 根据我的经验,它可以通过避免这种事情来节省您的时间!