递归组合函数 - 下标错误

时间:2015-05-18 13:24:54

标签: recursion fortran fortran90

我收到此错误并且无法调试我的代码,你们可以帮助我吗?目标是获得每个m个点的N个数字的组合。

 program combinations

     implicit none
     integer, parameter :: m_max = 3
     integer, parameter :: n_max = 5
     integer, dimension (m_max) :: comb
     character (*), parameter :: fmt='(i0' // repeat(', 1x, i0', m_max - 1) // ')'

     call gen (1)

   contains

     recursive subroutine gen (m)

       implicit NONE
       integer, intent (in) :: m
       integer :: n

       if (m.gt.m_max) then
         write (*,fmt) comb
       else
         do n = 1, n_max
           if ((m.eq.1).OR.(n.gt.comb(m-1))) then
             comb(m)= n
             call gen (m + 1)
           end if
         end do
       end if

     end subroutine gen

   end program combinations

我得到的错误是这样的:数组Comb的下标#1的值为0,小于1的下限。

我不明白这个消息,所以请帮帮我

1 个答案:

答案 0 :(得分:3)

来自编译器的运行时消息很明确:当数组comb(0)的下限为1(和上限comb)时,您正在尝试访问元素m_max

gen取值为1时,对m的第一次调用会发生此访问。您可以访问n.gt.comb(m-1)。这很糟糕。

您似乎认为在第一次测试m.eq.1时可能会出现一些短路现象。如果这是真的,您可能会认为,那么逻辑条件已经成立并且n.gt.comb(m-1)未经过测试。事实并非如此。