-1

このプログラムが機能しない理由がわかりません。C言語です。Unix では、「ログへの未定義の参照」が示されました。バグを見つけ出し、修正する方法を教えてくれる人はいますか?

下のコードの写真

または:

#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;
}

(転記ミスに気をつけて! ないことを願っています. )

4

1 に答える 1

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 Debugger の使用方法を学習すると役立つ場合があります。これは、 aを mainに設定しbreakpoint、コマンドをnext1 回入力して return キーを押し続けるだけで、プログラムがループから抜け出せないことがわかるからです。かなり長くなるので、この投稿にその出力を入れるつもりはありません。

于 2013-10-29T03:49:33.200 に答える