任何人都可以帮我弄清楚这个C程序中的错误

时间:2013-10-29 02:18:56

标签: c

我不知道为什么这个程序不起作用。这是C语言。在Unix中,它显示“未定义的日志引用”任何人都可以帮我找出错误并告诉我如何修复它?

picture of the code below

或者:

#include <stdio.h>
#include <math.h>

int main()
{
  double x0, x1=4, x2=5, y0, sta=10, error = 0.00001, base = 2;
  do
  {
    x0 = (x1 + x2) / 2;
    y0 = (x0) * (log(x0))/(log(base));
    if ( y0 > sta )
    {
      x2 = x0;
    }else{
      x1 = x0;
    }
  }while(y0 > error);
  printf("%lf", x0);

  return 0;
}

注意转录错误!我希望没有。

1 个答案:

答案 0 :(得分:3)

您必须链接到数学库。

  user@x:~/src$ 
  user@x:~/src$ gcc -Wall file_that_uses_math_library.c -o bin -lm

这应该可以解决您的问题。它没有找到log()函数,因为代码在编译时没有链接。


编辑: 您在对此答案的评论中提到“没有打印出来”。这是因为您的代码错误并且包含错​​误。条件y0 > error永远不会满足,因此循环是无限的。如果您接听 printf()并将其置于循环内部,您将看到循环永远不会结束,并且反复打印相同的值。

如果您编译/运行此代码,您将看到y0的值始终为10并且永远不会小于.000001

#include <stdio.h>
#include <math.h>

int main()
{
  double x0, x1=4, x2=5, y0, sta=10, error = 0.00001, base = 2;
  do
  {
    x0 = (x1 + x2) / 2;
    y0 = (x0) * (log(x0))/(log(base));
    if ( y0 > sta )
    {
      x2 = x0;
    }else{
      x1 = x0;
    }

  printf("%lf is not less than %f\n", y0, error);

  }while(y0 > error);
  return 0;
}

您可以从学习如何使用GNU调试器中受益,因为在主上设置 breakpoint ,输入命令next一次只需按住返回,您就会看到您的程序永远不会离开循环。我不打算把它的输出放到这篇文章中,因为它会很长。