Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 签名匹配另一个共享相同赋值泛型绑定的特定子例程(但它不';t)_Fortran - Fatal编程技术网

Fortran 签名匹配另一个共享相同赋值泛型绑定的特定子例程(但它不';t)

Fortran 签名匹配另一个共享相同赋值泛型绑定的特定子例程(但它不';t),fortran,Fortran,我正在从ifort14迁移到ifort16,在14日代码编译并运行良好,在16日我得到一个编译时错误,这对我来说毫无意义。长话短说编译器抱怨某个过程的定义是文件中的最后一个,如果我更改顺序,它会抱怨另一个过程,同样是最后一个。错误没有任何意义,这种行为也没有意义。这听起来有人熟悉吗?你知道我在哪里可以找到这个问题吗 我有以下结构 文件1: module model_generic implicit none type, abstract :: modelGen l

我正在从ifort14迁移到ifort16,在14日代码编译并运行良好,在16日我得到一个编译时错误,这对我来说毫无意义。长话短说编译器抱怨某个过程的定义是文件中的最后一个,如果我更改顺序,它会抱怨另一个过程,同样是最后一个。错误没有任何意义,这种行为也没有意义。这听起来有人熟悉吗?你知道我在哪里可以找到这个问题吗

我有以下结构

文件1:

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