对f_和fprime_的未定义引用

时间:2016-10-17 20:06:04

标签: fortran fortran90 gfortran

program main
implicit none
double precision p, a, b, tol
a = 1.0d0
b = 30.0d0
tol = 1e-8
call newtonbisection(p, a, b, tol)

contains

function f(x)
implicit none
double precision x,f
f = SIN(X) - exp(-x)
end function

function fprime(x)
implicit none
double precision fprime, x
fprime = COS(x) + exp(-x)
end function

subroutine newtonbisection(p, a, b, tol)
implicit none
double precision p, a, b, tol
double precision f, fprime
double precision fb, fp, fp2

a = 1.0d0
b = 30.0d0

p = a

do
fb = f(b)
fp = f(p)
fp2 = fprime(p)

p = p - (fp/fp2)

if (p < a .or. p > b) then
    p = (a+b) / 2.d0
end if

if (fp*fb < 0) then
    a = p
else
    b = p
end if
print*, "a, b, p, fp", a, b, p, fp

if (dabs(fp) < tol) then
   exit
end if

end do

end subroutine

end program

当我编译(gfortran newtonbisection.f90)时,我遇到了以下错误:

newtonbisection.f90:(.text+0x76): undefined reference to 'f_'

newtonbisection.f90:(.text+0x8f): undefined reference to 'f_'

newtonbisection.f90:(.text+0xa8): undefined reference to 'fprime_'

collect2: ld returned 1 exit status 

上次当我遇到类似问题时,将隐式无效并包含修复它们,但不是这次。为什么说f和fprime没有被定义?

1 个答案:

答案 0 :(得分:2)

你不能把行放在

  double precision f, fprime

进入子程序newtonbisection。这意味着ffprime将是外部函数,但它们不是,它们是主程序的内部函数。

删除该行。它没有位置,内部函数由于所谓的主机关联而看到其他函数,它们都包含在一个主机程序中。

此外,内部函数和子程序不需要重复implicit none,主程序中的implicit none在其中有效,因为它们包含在其中。