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