Fortran 77函数返回类型不匹配[重复]

问题描述 投票:0回答:2

此问题已经在这里有了答案:

我一直在尝试为大学项目学习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)是一个实数变量。

function fortran gfortran type-mismatch
2个回答
0
投票

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

因为您的函数是mass(),所以它以M开头并且未在主程序中声明,因此该函数在此处被视为整数函数。这与函数声明冲突,编译器抱怨。如果您想要保留极其古老的FORTRAN 77,则需要的是

real mass

在主程序中。

最好使用现代Fortran的功能,从IMPLICIT NONE开始并将该功能放入模块中或使其成为主程序的内部。

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


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的调用,并将其替换为任意分配,以推断它只是您在原始文章的省略的源代码中定义的功能。您在那里也需要相同的接口。

© www.soinside.com 2019 - 2024. All rights reserved.