Fortran关于创建函数

时间:2015-12-08 03:37:27

标签: function fortran

当我编译下面的程序时,我有一个错误

  

函数'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

我该如何解决这个问题?

1 个答案:

答案 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的返回类型和伪参数的信息。这使得编译器可以进行类型,种类,等级检查,如果您想利用某些语言功能(如返回数组或传递某些类型的参数),这也是必需的。