gfortran 编译器错误调用递归 log_gamma 函数
gfortran compiler error calling recursive log_gamma function
我上传了一个 2F1 超几何函数,但在我的电脑上无法编译。它来自 this article。我用
GNU Fortran (Built by Jeroen for the R-project) 8.3.0
随 RTools 4.0 一起提供。你能弄清楚为什么它不能编译以及如何解决这个问题吗?在下面的代码中,我只保留了产生错误的一行。接下来给出错误。
MODULE HYP_2F1_MODULE
!--------------------------------------------------------------------
IMPLICIT NONE
INTEGER, PARAMETER :: PR=KIND(1.0D0)
REAL(PR) :: ONE=1.0D0
CONTAINS
!
END MODULE HYP_2F1_MODULE
!
!----------------------------------------------------------------------
RECURSIVE FUNCTION LOG_GAMMA(Z) RESULT(RES)
USE HYP_2F1_MODULE
IMPLICIT NONE
COMPLEX(PR),INTENT(IN) :: Z
COMPLEX(PR) :: RES
!
RES = LOG_GAMMA( ONE -z);
!
END FUNCTION LOG_GAMMA
这是错误信息
testZ.f90:18:22:
RES = LOG_GAMMA( ONE - Z);
1
Error: 'x' argument of 'log_gamma' intrinsic at (1) must be REAL
有一个同名的 Fortran 2008+ 内部函数
16.9.119 LOG_GAMMA (X)
1 Description. Logarithm of the absolute value of the gamma function.
2 Class. Elemental function.
3 Argument. X
shall be of type real. Its value shall not be a negative integer or
zero.
这里有一些我不完全理解的冲突。显而易见的解决方法是重命名您的函数。我能说的是,如果没有 result 子句(由于递归属性,您需要它),内在函数将被隐藏。这可能是一个编译器错误。
还要考虑一下,同名的内在函数是否也不能从你的函数中做你需要的事情。
除了@VladimirF 的建议之外,您还可以添加编译器标志 -std=f95
以强制遵守 Fortran 95 标准。如果您还没有添加 -fall-intrinsics
这将禁用 Fortran 95 之后标准中的所有内在函数,并且应该使遗留代码正常工作。
我上传了一个 2F1 超几何函数,但在我的电脑上无法编译。它来自 this article。我用
GNU Fortran (Built by Jeroen for the R-project) 8.3.0
随 RTools 4.0 一起提供。你能弄清楚为什么它不能编译以及如何解决这个问题吗?在下面的代码中,我只保留了产生错误的一行。接下来给出错误。
MODULE HYP_2F1_MODULE
!--------------------------------------------------------------------
IMPLICIT NONE
INTEGER, PARAMETER :: PR=KIND(1.0D0)
REAL(PR) :: ONE=1.0D0
CONTAINS
!
END MODULE HYP_2F1_MODULE
!
!----------------------------------------------------------------------
RECURSIVE FUNCTION LOG_GAMMA(Z) RESULT(RES)
USE HYP_2F1_MODULE
IMPLICIT NONE
COMPLEX(PR),INTENT(IN) :: Z
COMPLEX(PR) :: RES
!
RES = LOG_GAMMA( ONE -z);
!
END FUNCTION LOG_GAMMA
这是错误信息
testZ.f90:18:22:
RES = LOG_GAMMA( ONE - Z);
1
Error: 'x' argument of 'log_gamma' intrinsic at (1) must be REAL
有一个同名的 Fortran 2008+ 内部函数
16.9.119 LOG_GAMMA (X)
1 Description. Logarithm of the absolute value of the gamma function.
2 Class. Elemental function.
3 Argument. X shall be of type real. Its value shall not be a negative integer or zero.
这里有一些我不完全理解的冲突。显而易见的解决方法是重命名您的函数。我能说的是,如果没有 result 子句(由于递归属性,您需要它),内在函数将被隐藏。这可能是一个编译器错误。
还要考虑一下,同名的内在函数是否也不能从你的函数中做你需要的事情。
除了@VladimirF 的建议之外,您还可以添加编译器标志 -std=f95
以强制遵守 Fortran 95 标准。如果您还没有添加 -fall-intrinsics
这将禁用 Fortran 95 之后标准中的所有内在函数,并且应该使遗留代码正常工作。