Fortran 签名匹配另一个共享相同赋值泛型绑定的特定子例程(但它不';t)
我正在从ifort14迁移到ifort16,在14日代码编译并运行良好,在16日我得到一个编译时错误,这对我来说毫无意义。长话短说编译器抱怨某个过程的定义是文件中的最后一个,如果我更改顺序,它会抱怨另一个过程,同样是最后一个。错误没有任何意义,这种行为也没有意义。这听起来有人熟悉吗?你知道我在哪里可以找到这个问题吗 我有以下结构 文件1:Fortran 签名匹配另一个共享相同赋值泛型绑定的特定子例程(但它不';t),fortran,Fortran,我正在从ifort14迁移到ifort16,在14日代码编译并运行良好,在16日我得到一个编译时错误,这对我来说毫无意义。长话短说编译器抱怨某个过程的定义是文件中的最后一个,如果我更改顺序,它会抱怨另一个过程,同样是最后一个。错误没有任何意义,这种行为也没有意义。这听起来有人熟悉吗?你知道我在哪里可以找到这个问题吗 我有以下结构 文件1: module model_generic implicit none type, abstract :: modelGen l
module model_generic
implicit none
type, abstract :: modelGen
logical, public :: init_flag = .false.
contains
procedure :: isInit => dispInitFlag_model
procedure, nopass :: taylorRule_func
procedure, nopass :: penalty_func
end type modelGen
contains
function dispInitFlag_model(this) result(init_flag)
class(modelGen), intent(in) :: this
logical :: init_flag
init_flag = this%init_flag
end function dispInitFlag_model
end module model_generic
文件2:
module model_nk_generic
use model_generic
implicit none
type, abstract, extends(modelGen) :: model_nk
logical, public :: init_flag_nk = .false.
contains
procedure :: isInit => dispInitFlag_model_nk
procedure :: setIniGuess => setIniGuess_model_nk_default
! deferred procedures
procedure(obj_func), deferred :: lossFunction
procedure(IS_PC_curves), deferred :: IS_PC0
procedure(Taylor_IS_PC_curves), deferred :: taylor_IS_PC
procedure(IS_curve), deferred :: IS
procedure(PC_curve), deferred :: PC
procedure(R_trans), deferred :: R_lom
procedure(A_trans), deferred :: A_lom
procedure(eps_trans), deferred :: eps_lom
generic :: IS_PC => IS_PC0, taylor_IS_PC
end type model_nk
abstract interface
! omitted
end interface
contains
function dispInitFlag_model_nk(this) result(init_flag_nk)
class(model_nk), intent(in) :: this
logical :: init_flag_nk
init_flag_nk = this%init_flag_nk
end function dispInitFlag_model_nk
subroutine setIniGuess_model_nk_default(this,VFonGrid,grid)
class(model_nk), intent(in) :: this
real(KIND=DP), dimension(:), intent(out) :: VFonGrid
real(KIND=DP), dimension(:,:), intent(in), optional :: grid
VFonGrid = 0e0
!VFonGrid = 1._DP
end subroutine setIniGuess_model_nk_default
end module model_nk_generic
我在编译过程中收到的错误(上面是作为更大项目的一部分编译的)是
该过程(或其绑定名称)不会出现在程序中的任何其他地方,只出现在调用它的一个模块中(我确实为它打了灰)。因此,它不能共享任何通用绑定。当我删除它时,编译器在dispInitFlag\u model\u nk
过程中给出了相同的错误。当我添加一个dou\u nothing
过程时,它会抱怨这个过程。编译器似乎总是抱怨文件中的最后一个过程
下面这样一个简单的测试用例编译得很好(使用相同的makefile)。另一个没有任何OOP特性的代码也可以编译
program main
use model_generic
use model_nk_generic
class(model_nk), allocatable :: svars
end program main
每次我做一个干净的编译,我使用的所有库都是从源代码编译的,除了MKL,但应该正确链接,我已经检查过了
有人知道源文件或我的编译环境有什么问题吗
Edit1:忘记提到编译器标志。通常我使用ifort-openmp-O3
,但我也尝试了我常用的一组调试标志ifort-openmp-g-p-traceback-check bounds-ftrapuv-fpe0-O0-warn-check uninit-gen interfaces-warn interfaces-check all
,我尝试了使用和不使用-openmp
标志。在某个时候,编译器告诉我该标志已被弃用,但改用-qopenmp
并没有改变什么
Edit2:也许我还应该提到我也使用了预处理器。这两个文件都经过了预处理。但在v14上,它仍然可以正常工作,并且在编译file1(其依赖项)后,错误发生在file2中 ifort v17会发生什么情况?您使用的命令行选项是什么?对于较新的ifort版本,可能某些解释已更改…?@IanH-Right,我忘了提到标志。我使用了
ifort-openmp-O3
,我还尝试了ifort-openmp-g-p traceback=check bounds-ftrapuv-fpe0-O0-warn
,并尝试了使用和不使用-openmp
。我现在找不到,但昨天编译器告诉我,-openmp
标志已被弃用,如果我没记错的话,我应该使用-qopenmp
。但弃用并不意味着破碎,加上我尝试过,当然这并没有改变任何事情。我将为问题添加标志,谢谢您指出。@IanH我不能使用v17,因为我没有许可证。它已安装在群集上,但我收到一个许可证错误。可能我们有少量的执照,我很不走运,它被检查出来了。我试图在我的笔记本电脑上安装评估副本,但它需要4GB的空间,我没有办法得到它。我有另一台机器,我可以安装它,但我需要先在VM中安装一个linux盒,我不太可能很快就有时间这么做。如果有机会我能让v17正常工作,我会向你汇报。我无法用你代码的可编译变体重现错误。如果没有一个完整的可编译的示例,就不能说更多了。如果这是一个编译器问题(症状使之成为可能),那么尝试最新版本(以及16的最新更新)是一个明显的建议。对于此类问题,如果您有权访问,最好在网站上发布或查看他们的卓越支持。iPort v17会发生什么?您使用的命令行选项是什么?对于较新的ifort版本,可能某些解释已更改…?@IanH-Right,我忘了提到标志。我使用了ifort-openmp-O3
,我还尝试了ifort-openmp-g-p traceback=check bounds-ftrapuv-fpe0-O0-warn
,并尝试了使用和不使用-openmp
。我现在找不到,但昨天编译器告诉我,-openmp
标志已被弃用,如果我没记错的话,我应该使用-qopenmp
。但弃用并不意味着破碎,加上我尝试过,当然这并没有改变任何事情。我将为问题添加标志,谢谢您指出。@IanH我不能使用v17,因为我没有许可证。它已安装在群集上,但我收到一个许可证错误。可能我们有少量的执照,我很不走运,它被检查出来了。我试图在我的笔记本电脑上安装评估副本,但它需要4GB的空间,我没有办法得到它。我有另一台机器,我可以安装它,但我需要先在VM中安装一个linux盒,我不太可能很快就有时间这么做。如果有机会我能让v17正常工作,我会向你汇报。我无法用你代码的可编译变体重现错误。如果没有一个完整的可编译的示例,就不能说更多了。如果这是一个编译器问题(症状使之成为可能),那么尝试最新版本(以及16的最新更新)是一个明显的建议。对于此类问题,如果您有权访问,最好在网站上发布或通过他们的卓越支持。
program main
use model_generic
use model_nk_generic
class(model_nk), allocatable :: svars
end program main