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中的PGI编译错误:“0”;“功能的正向引用”;_Fortran_Pgi - Fatal编程技术网

Fortran中的PGI编译错误:“0”;“功能的正向引用”;

Fortran中的PGI编译错误:“0”;“功能的正向引用”;,fortran,pgi,Fortran,Pgi,我对PGI Fortran编译器有点困惑 当我尝试使用pgfortran 19.10编译存储在名为test.f90文件中的以下简单模块时,我得到了我不理解的错误。使用gfortran或ifort编译时,运行良好 文件test.f90: MODULE CT IMPLICIT NONE integer, parameter :: si = SELECTED_INT_KIND(4) integer(kind=si), public, parameter :: strlen

我对PGI Fortran编译器有点困惑

当我尝试使用pgfortran 19.10编译存储在名为
test.f90
文件中的以下简单模块时,我得到了我不理解的错误。使用gfortran或ifort编译时,运行良好

文件
test.f90

MODULE CT
    IMPLICIT NONE
    integer, parameter :: si   = SELECTED_INT_KIND(4)
    integer(kind=si), public, parameter :: strlen   = 256


    type, public :: CMT
       integer (kind=si) :: nbTot 
       character(len=strlen), dimension(:), allocatable  :: condi 
    CONTAINS
       procedure :: find_line_condi 
    endtype CMT


 CONTAINS
    PURE function find_line_condi( table, cara ) result(k)
       IMPLICIT NONE
       class(CMT), intent(in)    :: table
       character(len=*), intent(in)  :: cara
       integer  (kind=si)   :: k
       integer  (kind=si)   :: j

       k=-1
       do j=1,table%nbTot
          if (trim(table%condi(j)) .eq. cara)  then
             k=j
             RETURN
          else if ( j == table%nbTot ) then
             k=-1
             RETURN
          endif
       enddo
    end function find_line_condi

END MODULE CT
使用
pgfortran-c test.f90进行编译时返回以下错误消息:

/opt/pgi/linux86-64-llvm/19.10/share/llvm/bin/llc: error: /opt/pgi/linux86-64-llvm/19.10/share/llvm/bin/llc: /tmp/pgfortranr2qeZBujkwvA.ll:23:77: error: invalid forward reference to function 'ct_find_line_condi_' with wrong type: expected 'i32 (i64*, i64*, i64*, i64)*' but was 'i16 (i64*, i64*, i64*, i64)*'
@ct$cmt$td$vft = global [1 x i8*] [i8* bitcast(i16 (i64*, i64*, i64*, i64)* @ct_find_line_condi_ to i8*)]

有人知道这个问题是从哪里来的吗?

这是编译器中的一个bug。考虑模块

MODULE CT
    IMPLICIT NONE

    type CMT
    CONTAINS
      procedure, nopass :: find_line_condi 
    endtype CMT

 CONTAINS
    function find_line_condi()
       integer(SELECTED_INT_KIND(4)) find_line_condi
       find_line_condi=0
    end function find_line_condi

END MODULE CT
这比那个问题简单多了。用pgfortran 19.10编译后,也有类似的乱码输出。它作为一个练习留给读者/PGI支持台,不管这个简单的代码是有效的FORTRAN应该被接受,但是我会认为不良的诊断是PGI更愿意避免的。< /P>

但是,这似乎是PGI的LLVM前端的一个弱点:考虑编译使用<代码> PGFORTRAN -C Mnollvm…< /代码>。还有一些方法可以重写代码来尝试解决这个bug,比如改变函数结果的类型



更广泛地说,2019年的PGI发布了LLVM代码生成器。这似乎经历了很多次。如果PGI 2019的代码意外失败(可能与2018的代码一起使用),那么使用
-Mnollvm
编译以使用非LLVM生成器是值得一试的。

这是编译器发出的错误消息,即使您有糟糕的Fortran代码,作为一条诊断信息,它是如此难以理解,以至于值得向供应商报告错误。如果您与PGI有支持协议,请向他们报告。
SELECTED\u INT\u KIND(4)
您真的想要半精度整数吗?我怀疑这个错误与此有关。。。尝试使用
iso_fortran_env
内部模块中的
si=INT32
,看看它是否编译。@jcerar是的,我需要它。但是你是对的,使用iso_fortran_env int32是避免问题的一种方法。根据你的评论,我将创建一个帐户并报告此问题。否则,选项
-Mnollvm
解决了问题,但由于LLVM似乎成为了他们的新标准(并且可能是未来的唯一选项),因此值得向他们提及这种情况。谢谢:作为Fortran编译器的非常活跃的用户,我鼓励人们报告错误。即使你有一个变通方法,其他人也会从更好的编译器中受益。这已经完成,我完全同意这种社区行为。