Function Fortran 77函数返回类型不匹配
我一直在为一个大学项目学习Fortran 77,我在windows 10中编写了以下代码:Function Fortran 77函数返回类型不匹配,function,fortran,gfortran,type-mismatch,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(*,
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))
有人能帮我解决这个问题吗?因为就我而言,我的函数返回一个实数,
masks(I)
是一个实数变量 默认的隐式类型规则是,如果名称的第一个字母是I、J、K、L、M或N,则数据类型为整数,否则为实数
因为您的函数是mass()
,它以M开头,并且没有在主程序中声明,所以在那里它被认为是一个整数函数。这与函数声明冲突,编译器会抱怨。如果你想保留非常古老的FORTRAN 77,你需要的是
real mass
在主程序中
最好使用现代Fortran的功能,从隐式NONE
开始,将函数放入模块或将其置于主程序内部
您也可以使用主程序中的替代隐式语句修复错误消息(请参阅我的注释),但我强烈反对除
implicit NONE
之外的任何操作。函数质量声明在主程序范围之外。因此,编译器会推断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
我有一个工作,修改版本的原始来源与此解决方案在。我删除了对Bethewis的调用,并将其替换为任意赋值,推断它只是您在原始帖子中省略的源代码中定义的函数。你也需要同样的界面 我想知道编译器是否正在处理函数中等式的整数元素的某种类型解析,例如“integer A,Z”,以及它们在返回语句之前参与的质量计算。也许gnu fortran有更严格的类型规则?谢谢你的回复@David W。我在上一个公式(Mass=..)中尝试用dble转换A和Z,但不幸的是没有任何改变。我必须承认我的fortran相当陈旧,但是,如果您将typedef从函数中移除,并确保返回类型的声明匹配,并且两者都是使用相同的大小写指定的,您不想写入
隐式整数(A-Z)
而不是整数A,Z
?但是,即使是,您实际需要的是在所有程序单元(主程序、函数和子例程)中隐式none
。此外,强烈地考虑本世纪FORTRAN的一些版本。请检查您是否准确复制了源代码。请确保我们无需任何[…]
@theodepasta即可自行编译,因为我终于找到了解决方案。贴出答案;请注意,它与Fortran 77不兼容,但它是解决此问题的Fortran 90技术之一。这种技术对于一次性连接旧式函数来说是很好的,但一般来说,学习模块要好得多。当然,接口不是用现代Fortran编写大型程序的通用工具。在这种特定情况下,只需在函数之前使用contains
,在函数之后使用end program
(正如我在回答中所说,将函数设置为内部)也会更快。同样,模块总体上要好得多。不要低估隐式无
的重要性。不要暗示这是一个广泛或普遍的解决方案;仅仅是达到解决编译问题的目的的一种手段。我敢肯定,任何涉及使用这种语言的项目都会出现许多其他问题。