我正在尝试了解一些Fortran代码。有一个子程序以2D数组作为输入。然后,从其他地方调用此子例程,但是将其传递给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
有人可以向我解释吗?
答案 0 :(得分:1)
这似乎是对编译器的一种攻击,因为您实际上将数组作为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及更高版本中,您不会做得那么糟糕,您应该并且应该将具有大小的数组直接传递给函数,然后直接使用它们。