【问题标题】:How to pass static arrays to functions that accept allocatable arrays without passing the length of the array如何将静态数组传递给接受可分配数组而不传递数组长度的函数
【发布时间】:2018-03-03 10:28:59
【问题描述】:

我在 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)

【问题讨论】:

  • @Yossarian,请不要在不查看可能需要改进的帖子内容的情况下进行大量编辑以删除标签。

标签: fortran


【解决方案1】:

你可以改变

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 所评论的,如果它具有 assumed-shape 数组参数,则该过程需要一个 显式接口 提供该接口的简单方法是让编译器生成界面;要么(最好)将程序放在moduleuse 中,要么(更有限的适用性)将其包含在另一个程序单元(可能是主程序单元)的contains 部分中。最后的手段,通常只在修改旧代码时采取,是自己编写一个interface 块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多