我一直在尝试为大学项目学习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)
是一个实变量。
答案 0 :(得分:0)
默认的隐式键入规则是,如果名称的首字母是I,J,K,L,M或N,则数据类型为整数,否则为实数。
因为您的函数是mass()
,所以它以M开头且未在主程序中声明,因此该函数在此处被视为整数函数。这与函数声明冲突,编译器抱怨。
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的调用,并将其替换为任意分配,以推断它只是您在原始帖子的省略的源代码中定义的功能。您在那里也需要相同的接口。