2016-09-24 4 views
0

ではない私は、C++プログラミングに比較的新しいです、私は、ニュートンラプソン法をコーディングするための割り当てを持っているしかし、私はエラーのエラーを持っている:エラー:呼び出されたオブジェクトタイプ「ダブル」関数または関数ポインタ

called object type 'double' is not a function or function pointer 

このエラーは、自分のコードをコンパイルしようとしているときに表示されます。私はポインターを割り当てるためにいくつかの基本的な変更を試みましたが、間違った方法でそれをやったことがあります。私のコードは以下に表示されています。

#include <iostream> 
#include <math.h> 

using namespace std; 

double f(double x); //this is f(x) 
double f(double x) { 
    double eq1 = exp(x) + pow(x,3) + 5; 
    return eq1; 
} 

double f1(double x); //this is the first derivative f'(x) 
double f1(double x) { 
    double eq2 = exp(x) + 3*pow(x,2); 
    return eq2; 
} 

int main() { 
    double x, xn, f, f1, eps; 
    cout << "Select first root :" << '\n'; //Here we select our first guess 
    cin >> xn; 
    cout << "Select Epsilon accuracy :" << '\n'; 
    cin >> epsi; 
    f = f(x); 
    f1 = f1(x); 
    cout << "x_n" << " " << "x_(n+1)" << " " << "|x_(n+1) - x_1|" << '\n'; 
    do { 
    x = xn; //This is the first iteneration step where x takes the value of the last itenarated (known) root xn 
    f = f(x); 
    f1 = f1(x); 
    xn = x - (f/f1); //this the formula that sets the itenaration going 
    cout << x << "  " << xn << "   " << fabs(xn - x) << '\n'; 
    } 

    while(fabs(xn - x) < epsi); //If |x_(n+1) - x_n| is smaller than the desired accurcay than the itenaration continues 
    cout << "The root of the equation is " << xn << '\n'; 

    return 0; 
} 

あなたは、Fと呼ばれる機能とf1とダブルスFと呼ばれ、F1キーを使用しようとしているあなたに

+2

これを[MCVE]に減らすことができますか?そのエラーを再現してください。 –

+1

どの行にエラーがありますか?あなたが話しているポインタはどこですか?そしてbtw iteration "iteration"ではなく "iteration"です。 – user463035818

+0

定義される前に関数を宣言する必要はありません。 – user463035818

答えて

0

ありがとうございます。変数や関数を何か他のもので呼び出すと、エラーを解決できます。これらの変数に、読者に何をしているのかを伝え、このような間違いを避けるために、これらの変数により良い名前を付けることは、良いコーディング慣行になります。

+0

ありがとうございます、はい、それはあなたがそれを説明するようになった今、私はまだ新しいです、そして、この不正確をたくさん作ります。 – Procracker15

1

あなたは、このように

f = f(x); 
f1 = f1(x); 

が動作しないことができる、関数と同じ名前のローカル変数を持っています。

関数または変数の名前を変更します。とにかく、一文字の変数/関数名はうまくありません。わかりやすい名前を使用してください。数週間後にコードを見ているあなた(または他の誰か)は、それに感謝します。

PS:前方宣言も必要ありません。そして、関数は少し短く書くことができます:

//double f(double x); // this you dont need 
double f(double x) { 
    return exp(x) + pow(x,3) + 5; 
} 

またusing namespace std; is considered bad practice。この場合、害はほとんどありませんが、問題が生じる前にこの悪い癖を取り除く方がよいでしょう。

最後に、コードを適切にフォーマットする必要があります。この

while(fabs(xn - x) < epsi); 

は、無限ループと思われるので、非常に厄介なように見えます。私はほとんどがdo-whileループを使用することはありません、しかし、私はあなたがこのようにそれを書くことをお勧め:あなたが同じ行に;でしばらく見るたび

do { 
    // ... 
} while(); 

するには、通常、あなたがパニックを開始する必要がありますので、() Whileループはdo-whileよりもはるかに一般的で、whileループの条件の後に;が発生するとエラーが発生する可能性があります。

+0

ありがとうございます、これですべてがクリアされ、コードは完全に動作します:) – Procracker15

0

コードにいくつかの誤りがありました。私はそれがコンパイル製:

#include <iostream> 
#include <math.h> 

using namespace std; 

double func(double x); //this is f(x) 
double func(double x) { 
    double eq1 = exp(x) + pow(x,3) + 5; 
    return eq1; 
} 

double func1(double x); //this is the first derivative f'(x) 
double func1(double x) { 
    double eq2 = exp(x) + 3*pow(x,2); 
    return eq2; 
} 

int main() { 
    double x, xn, f, f1, eps; 
    cout << "Select first root :" << '\n'; //Here we select our first guess 
    cin >> xn; 
    cout << "Select Epsilon accuracy :" << '\n'; 
    cin >> eps; 
    f = func(x); 
    f1 = func1(x); 
    cout << "x_n" << " " << "x_(n+1)" << " " << "|x_(n+1) - x_1|" << '\n'; 
    do { 
    x = xn; //This is the first iteneration step where x takes the value of the last itenarated (known) root xn 
    f = func(x); 
    f1 = func1(x); 
    xn = x - (f/f1); //this the formula that sets the itenaration going 
    cout << x << "  " << xn << "   " << fabs(xn - x) << '\n'; 
    } 

    while(fabs(xn - x) < eps); //If |x_(n+1) - x_n| is smaller than the desired accurcay than the itenaration continues 
    cout << "The root of the equation is " << xn << '\n'; 

    return 0; 
} 

主な問題は以下の通りであった。

  1. は、あなたが(同じエラーがf'(x)機能のために繰り返された)と
  2. f(x)機能の同じ名前の変数 fを定義し
  3. eps変数がプログラム内にイプシロンを表すと宣言しましたが、epsiと呼んで数回アクセスしようとしました。
関連する問題