Function 如何在Fortran子例程中创建函数?
当我编译代码时,结果很奇怪(非常大,如-1.112E+09)。当我用Matlab计算时,答案是-0.0873Function 如何在Fortran子例程中创建函数?,function,fortran,call,subroutine,Function,Fortran,Call,Subroutine,当我编译代码时,结果很奇怪(非常大,如-1.112E+09)。当我用Matlab计算时,答案是-0.0873 program test real, parameter :: X11=10,X22=5,X33=5,BE1A1=2,BE1B1=2 real :: Y call J(X11,X22,X33,BE1A1,BE1B1,M) Y = M print *,Y end program test subroutine J(X1,X2,X3,BE1A1,BE1B1,M) real
program test
real, parameter :: X11=10,X22=5,X33=5,BE1A1=2,BE1B1=2
real :: Y
call J(X11,X22,X33,BE1A1,BE1B1,M)
Y = M
print *,Y
end program test
subroutine J(X1,X2,X3,BE1A1,BE1B1,M)
real, intent(in) :: X1,X2,X3,BE1A1,BE1B1
real, intent(out) :: M
M = J1(X1,X2,X3,BE1A1,BE1B1)-J1(X1,X2,X3,BE1A1,-BE1B1)-J1(X1,X2,X3,-BE1A1,BE1B1)+J1(X1,X2,X3,-BE1A1,-BE1B1)
contains
real function J1(X1,X2,X3,EPS1,EPS2)
real, intent(in) :: X1,X2,X3,EPS1,EPS2
real :: R
R = sqrt((X1-EPS1)**2+(X2-EPS2)**2+(X3)**2)
J1 = log(R+X2-EPS2)
end function J1
end subroutine J
现在我可以用Matlab得到同样的结果了 您应该了解隐式类型规则。特别是主程序中的
m
。谢谢,我想我明白要点了。@VladimirF谢谢你的建议。我知道如果使用隐式无
,可能会更安全。请弄清楚你改变了什么,很难在代码中找到。
program test
real, parameter :: X11=10,X22=5,X33=5,BE1A1=2,BE1B1=2
real :: Y
call J(X11,X22,X33,BE1A1,BE1B1,CM)
Y = CM
print *,Y
end program test
subroutine J(X1,X2,X3,BE1A1,BE1B1,CM)
real, intent(in) :: X1,X2,X3,BE1A1,BE1B1
real, intent(out) :: CM
CM = J1(X1,X2,X3,BE1A1,BE1B1)-J1(X1,X2,X3,BE1A1,-BE1B1)-J1(X1,X2,X3,-BE1A1,BE1B1)+J1(X1,X2,X3,-BE1A1,-BE1B1)
contains
real function J1(X1,X2,X3,EPS1,EPS2)
real, intent(in) :: X1,X2,X3,EPS1,EPS2
real :: R
R = sqrt((X1-EPS1)**2+(X2-EPS2)**2+(X3)**2)
J1 = log(R+X2-EPS2)
end function J1
end subroutine J