当我编译下面的程序时,我有一个错误
函数'j17'的返回类型不匹配(未知/真实(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
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
Gfortran 发出第二个错误,它比您发布的错误更有帮助:
jfun.f90:5:14:
write(*,*) J17(R,X1,X3,EPS1)
1
Error: Function ‘j17’ at (1) has no IMPLICIT type
Run Code Online (Sandbox Code Playgroud)
在您的主程序中,您没有提供类型j17,因为隐式类型被禁用(一件好事),编译器无法确定它的类型。您发布的错误是unknown(在您的主程序中)和real(在您的函数中)不匹配类型的结果。
为了解决这个问题,让你的主程序知道 j17 的类型。您可以通过在主程序中简单地声明它来做到这一点
real :: j17
Run Code Online (Sandbox Code Playgroud)
这将设置外部函数引用的类型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
Run Code Online (Sandbox Code Playgroud)
另一种方法是将 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
Run Code Online (Sandbox Code Playgroud)
这两种方法都为编译器提供了有关函数j17返回类型和虚拟参数的信息。这让编译器可以进行类型、种类、等级检查,如果您想利用某些语言功能(如返回数组或传递某些类型的参数),这也是强制性的。
| 归档时间: |
|
| 查看次数: |
51 次 |
| 最近记录: |