数组在传递给Fortran中的子例程时是否像指针一样对待?

时间:2018-12-04 21:34:12

标签: arrays pointers fortran

我正在尝试了解一些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

有人可以向我解释吗?

1 个答案:

答案 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及更高版本中,您不会做得那么糟糕,您应该并且应该将具有大小的数组直接传递给函数,然后直接使用它们。