【问题标题】:Fortran Subroutine not returning valueFortran 子程序不返回值
【发布时间】:2019-02-20 12:46:47
【问题描述】:

我遇到了一个奇怪的问题。 我正在使用 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。 非常感谢任何帮助

【问题讨论】:

  • 请显示更多代码 (minimal reproducible example)。程序是如何连接的?它们在一个模块中吗?它们是外部的吗?是否有可用的显式接口?不要使用...,显示真实代码。您可以简化它,但在发布之前测试简化的代码。使用编译器拥有的所有调试功能(如 gfortran -g -Wall -fcheck=all)。
  • 例程的虚拟参数和实际参数在类型、种类和等级上不一定匹配。使用隐式 none 并在范围内获取接口,那么您将永远不会出现此类错误。
  • 问题是子程序在不同的文件中。一旦我将子程序包含在与函数相同的模块中,一切都会正常工作。

标签: fortran return return-value subroutine locate


【解决方案1】:

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

【讨论】:

  • 正如您所描述的那样,应该没有任何区别,我强烈怀疑您还有另一个问题,即重新排列内存中的程序现在正在屏蔽。您正在使用所有运行时检查?
猜你喜欢
  • 2016-11-03
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 2013-04-22
  • 1970-01-01
  • 2013-08-14
相关资源
最近更新 更多