Fortran 77函数返回类型不匹配

时间:2019-10-24 19:04:54

标签: function fortran gfortran type-mismatch

我一直在尝试为大学项目学习Fortran 77,并在Windows 10中编写以下代码:

program Q_Value
real BEs(4),Masses(4)
real Q,Tthr
integer i,Nuclei(4,2),A,Z

do 10 i=1,4,1
        write(*,100)'Give the info for Nuclei:',i
 100        format(A,I1)
        write(*,*)'A='
        read(*,*)Nuclei(i,1)
        write(*,*)'Z='
        read(*,*)Nuclei(i,2)
        if((Nuclei(i,1).EQ.0).OR.(Nuclei(i,2).EQ.0))then
            BEs(i)=0.
        else
            BEs(i)=BetheWeiss(Nuclei(i,1),Nuclei(i,2))
        endif
        Masses(i)=Mass(Nuclei(i,1),Nuclei(i,2),BEs(i))
 10 continue

[...]
end
real function Mass(A,Z,BE)
    integer A,Z
    real BE,mass
c   local var's
    parameter(Mp=938.2720813,Mn=939.5654133)
c   statements
    Mass=((A-Z)*Mn)+(Z*Mp)-BE
    return 
    end

在GNU Fortran(gfortran 8.1.0)中进行编译时,出现以下错误:

Masses(i)=Mass(Nuclei(i,1),Nuclei(i,2),BEs(i))
                     1
Error: Return type mismatch of function 'mass' at (1) (INTEGER(4)/REAL(4))

任何人都可以帮我解决这个问题,因为就我而言,我的函数返回一个实数,而Masses(i)是一个实变量。

2 个答案:

答案 0 :(得分:0)

默认的隐式键入规则是,如果名称的首字母是I,J,K,L,M或N,则数据类型为整数,否则为实数。

因为您的函数是mass(),所以它以M开头且未在主程序中声明,因此该函数在此处被视为整数函数。这与函数声明冲突,编译器抱怨。

如果要保留极其古老的FORTRAN 77,您需要的是

real mass

在主程序中。

使用现代Fortran的功能要好得多,从IMPLICIT NONE开始,然后将该功能放入模块或使其成为主程序的内部。

您还可以在主程序中使用替代的隐式语句来修正错误消息(请参阅我的评论),但我强烈不鼓励使用IMPLICIT NONE以外的任何内容。

答案 1 :(得分:0)

函数Mass声明在主程序范围之外。结果,即使在同一源块中明确声明了质量函数,编译器仍会为其推断类型。为了克服这个问题,您需要在调用程序中声明一个接口块:

program Q_Value
[...]
interface Mass
  real function Mass(A,Z,BE)
  integer :: A
  integer :: Z 
  real :: BE
  end function
  end interface 

end program

real function Mass(A, Z, BE)
[..]
end function

我在https://onlinegdb.com/BkjLxcy9S上有使用此解决方案的原始源的有效修改版本。我删除了对BetheWeiss的调用,并将其替换为任意分配,以推断它只是您在原始帖子的省略的源代码中定义的功能。您在那里也需要相同的接口。