Fortran子例程未返回值

时间:2019-02-20 12:46:47

标签: fortran return return-value subroutine locate

我遇到一个奇怪的问题。 我正在使用Fortran-Recipe书中的locate子例程。 目的是在CDF表中找到一个随机数并返回arrax的索引,这样我就可以在另一个表中查找将要对应的值。 但是我不能使它传回j的值(包含函数中的jlo)。它只是保持0。 子例程 locate 将j的值更改为正确的值,但随后不将其传递回去。

      SUBROUTINE locate(xx,n,x,j)
      INTEGER, INTENT(out) :: j
      REAL*8 x,xx(n)
      INTEGER jl,jm,ju,n
      jl=0
      ju=n+1

10    if(ju-jl.gt.1)then
        jm=(ju+jl)/2
        if((xx(n).ge.xx(1)).eqv.(x.ge.xx(jm)))then
          jl=jm
        else
          ju=jm
        endif
      goto 10
      endif

      if(x.eq.xx(1))then
        j=1
      else if(x.eq.xx(n))then
        j=n-1
      else
        j=jl
      endif
      return
      END

这是子程序的设计

这是它的包含方式:

function CDF() result(xyz)
implicit none
real(BW) :: rand
integer(I2B) :: jlo, N_points_table
real(BW), allocatable :: CDFtable(:)


N_points_table= 1000
jlo=0
CALL RANDOM_NUMBER(rand)

allocate(CDFtable(N_points_table))
...
!setting the content of CDFtable to a CDF of some kind
...
call locate(CDFtable,N_points_table,rand,jlo)
....
....

但是,在子例程运行之后,jlo在启动时仍为0。 任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

问题在于子例程位于另一个文件中。一旦我将该子例程包含在与该函数相同的模块中,所有子例程都将正常工作。