Fortran子程序不返回值

Fortran子程序不返回值,fortran,return,return-value,subroutine,locate,Fortran,Return,Return Value,Subroutine,Locate,我遇到了一个奇怪的问题。 我正在使用Fortran配方书中的locate子程序。 目标是在CDF表中找到一个随机数并返回arrax的索引,这样我就可以在另一个表中查找对应的值。 但是,我无法将它转换为将j(包含函数中的jlo)的值传递回。它只是保持0。 子程序locate将j的值更改为正确的值,但随后不会将其传回 SUBROUTINE locate(xx,n,x,j) INTEGER, INTENT(out) :: j REAL*8 x,xx(n)

我遇到了一个奇怪的问题。 我正在使用Fortran配方书中的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。
非常感谢您的帮助

问题在于子程序位于不同的文件中。一旦我将子程序与函数包含在同一个模块中,所有功能都会正常工作。

请显示更多代码()。这些程序是如何联系起来的?它们在模块中吗?它们是外部的吗?是否有明确的接口可用?不要使用
,显示真实代码。您可以简化它,但是在发布之前测试简化的代码。使用编译器的所有调试功能(如
gfortran-g-Wall-fcheck=all
)。例程的伪参数和实际参数不一定在类型、种类和等级上匹配。使用implicit none并在作用域中获取接口,则永远不会出现此类错误。问题是子例程位于不同的文件中。一旦我把子程序和函数放在同一个模块中,所有的函数都工作得很好。正如你所描述的那样,应该没有任何区别,我强烈怀疑你还有另一个问题,重新安排内存中的程序现在是屏蔽。您正在使用所有运行时检查?