函数引用正在调用子例程
A function reference is invoking a subroutine
我有 CERN 程序可以计算复数参数的伽马函数,但由于缺乏 Fortran 知识,我无法运行该程序。
我有以下程序:
PROGRAM Console1
IMPLICIT REAL *8 (A-H,O-Z)
COMPLEX *16 gama,z,w
z=cmplx(0,0.707106781186548d0)
gama=cgamma(0,z,w)
END
SUBROUTINE cgamma(mo, z, w)
INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(14, 60)
INTEGER, INTENT(IN) :: mo
COMPLEX (dp), INTENT(IN) :: z
COMPLEX (dp), INTENT(OUT) :: w
... the subroutine code here
END SUBROUTINE cgamma
然后出现错误
error #6553: A function reference is invoking a subroutine subprogram. [CGAMMA]
从技术上讲,它不是一个程序。
我将在下面的 link 中重新发布部分文档,请注意 SUBROUTINE cgamma
和 END SUBROUTINE cgamma
作为非常 first 和非常 最后 行。从技术上讲,这个文件不是 Fortran 程序,它只是一个更大程序的一部分的子例程。
SUBROUTINE cgamma(mo, z, w)
IMPLICIT NONE
! variables and code not worth posting to illustrate what is happening
60 w = CMPLX(w1, w2, KIND=dp)
RETURN
70 w = (0.0_dp, 0.0_dp)
RETURN
CONTAINS
FUNCTION rexp(x) RESULT(fn_val)
! extra code here, do not need to post it
fn_val = -1.0_dp
RETURN
END FUNCTION rexp
END SUBROUTINE cgamma
在 fortran 中,文件的第一行和最后一行是 PROGRAM whatever
和 END
.
因此您要么需要获取完整程序并使用调用此 cgamma 子例程的程序,要么编写您自己的 fortran PROGRAM
然后调用此 cgamma
子例程。
查看报错信息:
A function reference is invoking a subroutine subprogram.
SUBROUTINE cgamma(mo, z, w)
END SUBROUTINE
将 cgamma
定义为(在本例中为外部)子例程。
节目中
gama=cgamma(0,z,w)
将 cgamma
作为函数引用(返回要分配给 gama
的结果)。这是错误消息所指的不兼容性。
要解决此问题,您需要使用 call
语句引用子例程,或将 cgamma
更改为函数,返回适当的结果。
鉴于程序的设计(三个参数),我希望函数是预期的。
我有 CERN 程序可以计算复数参数的伽马函数,但由于缺乏 Fortran 知识,我无法运行该程序。
我有以下程序:
PROGRAM Console1
IMPLICIT REAL *8 (A-H,O-Z)
COMPLEX *16 gama,z,w
z=cmplx(0,0.707106781186548d0)
gama=cgamma(0,z,w)
END
SUBROUTINE cgamma(mo, z, w)
INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(14, 60)
INTEGER, INTENT(IN) :: mo
COMPLEX (dp), INTENT(IN) :: z
COMPLEX (dp), INTENT(OUT) :: w
... the subroutine code here
END SUBROUTINE cgamma
然后出现错误
error #6553: A function reference is invoking a subroutine subprogram. [CGAMMA]
从技术上讲,它不是一个程序。
我将在下面的 link 中重新发布部分文档,请注意 SUBROUTINE cgamma
和 END SUBROUTINE cgamma
作为非常 first 和非常 最后 行。从技术上讲,这个文件不是 Fortran 程序,它只是一个更大程序的一部分的子例程。
SUBROUTINE cgamma(mo, z, w)
IMPLICIT NONE
! variables and code not worth posting to illustrate what is happening
60 w = CMPLX(w1, w2, KIND=dp)
RETURN
70 w = (0.0_dp, 0.0_dp)
RETURN
CONTAINS
FUNCTION rexp(x) RESULT(fn_val)
! extra code here, do not need to post it
fn_val = -1.0_dp
RETURN
END FUNCTION rexp
END SUBROUTINE cgamma
在 fortran 中,文件的第一行和最后一行是 PROGRAM whatever
和 END
.
因此您要么需要获取完整程序并使用调用此 cgamma 子例程的程序,要么编写您自己的 fortran PROGRAM
然后调用此 cgamma
子例程。
查看报错信息:
A function reference is invoking a subroutine subprogram.
SUBROUTINE cgamma(mo, z, w)
END SUBROUTINE
将 cgamma
定义为(在本例中为外部)子例程。
节目中
gama=cgamma(0,z,w)
将 cgamma
作为函数引用(返回要分配给 gama
的结果)。这是错误消息所指的不兼容性。
要解决此问题,您需要使用 call
语句引用子例程,或将 cgamma
更改为函数,返回适当的结果。
鉴于程序的设计(三个参数),我希望函数是预期的。