1

トリグ関数名を変更することで、segfault を取り除くことができます。しかし、その理由は私には完全には明らかではありません。私の推測では、実装内で再帰呼び出しが発生します。誰かがここで厳密な説明をしてもらえますか?

さらに、私はこのように物事を維持したいと思っているので、関数の名前をそのままにしておくために何を追加/変更する必要があるのか​​ 疑問に思っています。

PS: ここで C++ を始めたばかりなので、ばかげた質問であることはわかっています。:)

コード:

#include <iostream>
#include <string>
#include <cmath>

#define _USE_MATH_DEFINES

using namespace std;

/*
   Represents a calculator with various functions.
*/
class Calc {
public:
    //arithmetic functions
    static double sum(double a, double b){ return a+b; };
    static double subtract(double a, double b){ return a-b;};
    static double multiply(double a, double b){ return a*b; };
    static double divide(double a, double b){ if (b == 0) return b; return a/b; };
    static double avg(double a, double b){ return (a+b)/2; };

    //trigonometric funcitons
    static double sin(double x){ return sin(M_PI*x); };
    static double cos(double x){ return cos(M_PI*x); };
    static double tan(double x){ return tan(M_PI*x); };
};

void getValue(double *a){
    cout << "Please, enter a value: " << endl;
        cin >> (*a);
}

void getValues(double *a, double *b){
    cout << "Please, enter two values: " << endl;
        cin >> (*a) >> (*b);
}

bool getCommand(string *cmd){
    cout << "Please, enter a command (+,-,*,/,avg, sin, cos, tan, exit): ";
    cin >> (*cmd);
    if ( (*cmd) == "exit"){
        return false;
    } else {
        return true;
    }
}

int main (){
    string cmd;
    double a,b;

    while (getCommand(&cmd)){
        if (cmd == "sin" || cmd == "cos" || cmd == "tan"){
            getValue(&a);
            if (cmd == "sin"){
                cout << "Sine: " << Calc::sin(a) << endl;
            } else if (cmd == "cos"){
                cout << "Cosine: " << Calc::cos(a) << endl;
            } else if (cmd == "tan"){
                cout << "Tangent: " << Calc::tan(a) << endl;
            }
        } else {
            getValues(&a,&b);
            if (cmd == "+"){
                cout << "Summation: " << Calc::sum(a,b) << endl;
            } else if (cmd == "-"){
                cout << "Subtracttion: " << Calc::subtract(a,b) << endl;
            } else if (cmd == "*"){
                cout << "Multiplication: " << Calc::multiply(a,b) << endl;
            } else if (cmd == "/"){
                cout << "Division: " << Calc::divide(a,b) << endl;
            } else if (cmd == "avg"){
                cout << "Average: " << Calc::avg(a,b) << endl;
            }
        }
    }
    return 0;
}
4

2 に答える 2

7

わかりました、再帰呼び出しです。私はあなたが欲しいと思います

static double sin(double x){ return ::sin(M_PI*x); };

スコープ解決演算子::を使用すると、sin 関数は再帰的に呼び出すのではなく、グローバルな sin 関数を呼び出すようになります。

ところで、度をラジアンに変換しようとしている場合は、実際に必要です

static double sin(double x){ return ::sin((M_PI/180.0)*x); };

于 2012-11-15T08:06:35.287 に答える
1

1) あなたはあなたの#define _USE_MATH_DEFINES 前にすべきです#include <cmath>

2)あなたのCalc関数には確かに無限再帰が含まれています(それらは自分自身を呼び出しています)。次のように変更する必要があります。

static double sin(double x){ return std::sin(M_PI*x); }

つまり、呼び出しを修飾してsin()、グローバルなものを呼び出したいことを明確にします。

于 2012-11-15T08:07:20.873 に答える