当我编译下面的程序时,我有一个错误
函数'j17'的返回类型不匹配(unknown / real(4))“
program Jfun
implicit none
real :: R = 1.5, X1 = 2.5, X3 = 4.8, EPS1 = 0.5
write(*,*) J17(R,X1,X3,EPS1)
end program Jfun
real function J17(R,X1,X3,EPS1)
implicit none
real, intent(in) :: R,X1,X3,EPS1
J17 = -((R+X1-EPS1)*(X3**2-R**2)+(X3**2)*R)/(R**3)/((R+X1-EPS1)**2)
end function J17
我该如何解决这个问题?
答案 0 :(得分:4)
Gfortran发出的第二个错误比您发布的错误更有用:
jfun.f90:5:14:
write(*,*) J17(R,X1,X3,EPS1)
1
Error: Function ‘j17’ at (1) has no IMPLICIT type
在您的主程序中,您还没有为j17
提供类型,并且由于隐式类型被禁用(一件好事),编译器无法为其确定类型。您发布的错误是unknown
(在您的主程序中)和real
(在您的函数中)不匹配类型的结果。
要解决此问题,请让主程序了解j17的类型。您只需在主程序中声明它即可完成此操作
real :: j17
这会将外部函数引用的类型设置为real
,这将编译。然而,这并不理想,因为没有检查函数参数。为此,显式接口很有用。您可以手动编写显式接口,但让编译器为您生成它更容易。
一种方法是使j17
成为内部函数:
program Jfun
implicit none
real :: R = 1.5, X1 = 2.5, X3 = 4.8, EPS1 = 0.5
write(*,*) J17(R,X1,X3,EPS1)
contains
real function J17(R,X1,X3,EPS1)
implicit none
real, intent(in) :: R,X1,X3,EPS1
J17 = -((R+X1-EPS1)*(X3**2-R**2)+(X3**2)*R)/(R**3)/((R+X1-EPS1)**2)
end function J17
end program Jfun
另一种方法是将j17放入模块中:
module jfunc
contains
real function J17(R,X1,X3,EPS1)
implicit none
real, intent(in) :: R,X1,X3,EPS1
J17 = -((R+X1-EPS1)*(X3**2-R**2)+(X3**2)*R)/(R**3)/((R+X1-EPS1)**2)
end function J17
end module jfunc
program Jfun
use jfunc
implicit none
real :: R = 1.5, X1 = 2.5, X3 = 4.8, EPS1 = 0.5
write(*,*) J17(R,X1,X3,EPS1)
end program Jfun
这两种方法都为编译器提供了有关函数j17
的返回类型和伪参数的信息。这使得编译器可以进行类型,种类,等级检查,如果您想利用某些语言功能(如返回数组或传递某些类型的参数),这也是必需的。