如何将静态数组传递给接受可分配数组的函数,而不传递数组的长度

时间:2017-09-21 23:22:16

标签: fortran

我在Fortran中编写了一个Knuth shuffle,如下所示

subroutine knuth_shuffle(array, length)
    implicit none

    integer :: length
    integer :: array(length)

    integer :: randomIndex
    integer :: temp

    do i = 1, length - 2
        randomIndex = floor(randomBetween(real(i), real(length)))
        temp = array(i)
        array(i) = array(randomIndex)
        array(randomIndex) = temp
    enddo
end subroutine knuth_shuffle

每次调用子程序时,我都必须输入数组长度。

call knuth_shuffle(A, size(A))

有没有办法可以更改子程序,所以当我调用它时,它看起来更像是:

call knuth_shuffle(A)

1 个答案:

答案 0 :(得分:3)

你可以改变

subroutine knuth_shuffle(array, length)
    implicit none

    integer :: length
    integer :: array(length)

    integer :: randomIndex
    integer :: temp

subroutine knuth_shuffle(array)
    implicit none

    integer :: array(:)

    integer :: length
    integer :: randomIndex
    integer :: temp

    length = size(array)

或者你可以扔掉本地变量length并写下

subroutine knuth_shuffle(array)
    implicit none

    integer :: array(:)

    integer :: randomIndex
    integer :: temp
    integer :: i

    do i = 1, size(array) - 2
        randomIndex = floor(randomBetween(real(i), real(size(array))))
        temp = array(i)
        array(i) = array(randomIndex)
        array(randomIndex) = temp
    enddo
end subroutine knuth_shuffle

我正在回答:子程序不知道或不关心提供为array的实际参数是可分配的还是静态的。子例程中没有任何内容受到数组分配状态的影响,也不会影响数组的分配状态。从子例程的角度来看,array假设形状,在这一点上可以看到this question and answer

正如@francescalus评论的那样,如果它有假定形状数组参数,则该过程需要显式接口提供这种方法的简单方法是让编译器生成接口; (优先)将程序放在moduleuse中或(更有限的适用性)将其包含在另一个程序单元(可能是主程序单元)的contains部分中。最后一种方法,通常只在修改旧代码时才采用,就是自己编写一个interface块。