在Fortran中将数组传递给子例程时,是否将其视为指针



我正在努力理解一些Fortran代码。有一个子程序,它把一个二维数组作为输入。然后从其他地方调用此子例程,但传递的是2D数组的第一个元素,而不是数组本身。然而,子程序似乎将此输入视为2D数组本身,并且能够访问其所有元素。这使得子程序实际上接受了一个指向标量的指针,就像在C/C++中传递数组一样。

我举了一个小例子来说明我的意思:

program main
dimension k(2, 2);
k(1, 1) = 1; k(1, 2) = 2
k(2, 1) = 4; k(2, 2) = 3
call test(2, k(1, 1))
end program
subroutine test(n, k)
dimension k(n, n)
do i=1, n
write(*, '(2(I1 X))') (k(i,j), j=1,n)
end do
end subroutine test

该程序输出以下内容:

1 2
3 4

有人能向我解释一下吗?

这似乎是对编译器的攻击,因为您实际上将数组作为2D(1,1(元素传递(请参见http://astroa.physics.metu.edu.tr/MANUALS/intel_ifc/mergedProjects/optaps_for/fortran/optaps_prg_arrs_f.htm英特尔似乎已经改变了他们的链接…(。正如您在底部看到的,您经过一个固定形状的数组。

然后在函数本身中,您破解编译器并设置数组dimension k(n, n)的大小,这样它就与您指定的值不同了。

这可能是Fortran 77代码,在Fortran 90及更高版本中,您不会做像这样糟糕的事情,因为您可以而且应该将具有大小的数组直接传递给函数,函数会直接使用它们。

相关内容

最新更新