Fortran 77函数返回类型不匹配



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

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

因为你的函数是mass(),它以M开头,并且没有在主程序中声明,所以它被认为是一个整数函数。这与函数声明冲突,编译器会抱怨。如果你想保留极其古老的FORTRAN 77,你需要的是

real mass

在主程序中。

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

您也可以在主程序中使用另一条隐式语句来修复错误消息(请参阅我的评论(,但我强烈反对使用IMPLICIT NONE以外的任何其他语句。

函数Mass在主程序的范围之外声明。因此,编译器推断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.我删除了对BethWeiss的调用,并用一个任意的赋值替换了它,推断它只是你在原始帖子的省略源中定义的一个函数。你也需要同样的界面。

相关内容

最新更新