0

以前の投稿を編集して、より完全な質問を提供しました。

ヘッダー ファイルで 5 つのオブジェクトを作成したい Heliostat という名前のクラスがあります。そのうちの 3 つはクラス ベクトルから、2 つはクラス ターゲットからのものです。ベクトル クラス コンストラクターは、演算子ターゲット オブジェクトまたはベクトル オブジェクトとして必要です。プログラムが演算子をどのタイプとしても認識しないというエラーが表示されます。コードをお伝えします。私はEclipse内のarduinoプロジェクトで働いています。

これはヘリオスタット クラス ヘッダーです。

    #ifndef HELIOSTAT_H_
    #define HELIOSTAT_H_

    #include "Target.h"
    #include "TargetCatalog.h"
    #include "vector.h"
    #include "Sun.h"



    class Heliostat {


    private:


    public:

        double Pitch;
        double Azimuth;

        Target heliostat(4501472.0,662766.0,1.0);
        Target reactor(4501474.0,662768.0,30.0);
        Vector sunsVec(Sun::getPitch1year(),Sun::getAzimuth1yearArcsin());
        Vector reactVec(heliostat,reactor);
        Vector normalVec(reactVec,sunsVec);

        Heliostat();
        virtual ~Heliostat();

    };

    #endif /* HELIOSTAT_H_ */

書かれていない機能がいくつかあります。cpp には空のコンストラクタだけがほとんどありません。

ターゲット クラス ヘッダー:

    #ifndef TARGET_H_
#define TARGET_H_

class Target {

private:


public:
    enum targetlist{Helio,React,Normalpoint};

    double gpsX;
    double gpsY;
    double gpsZ;

    Target(double gpsEast, double gpsNorth, double gpsAlt);
    virtual ~Target();
};

#endif /* TARGET_H_ */

ベクトル クラス ヘッダー:

    #ifndef VECTOR_H_
#define VECTOR_H_

#include "Target.h"

class Vector {
public:

    double easting;
    double northing;
    double altitude;


    Vector(Target startTarget,Target endTarget);
    Vector(double targetsPitch,double targetsAzimuth);
    Vector(Vector reactorVector,Vector sunVector);
    double calculateInclinationAngle(Vector reactorVector,Vector sunVector);
    double getPitch(Vector helioNormalVec);
    double getAzimuth(Vector helioNormalVec);
    virtual ~Vector();

};

#endif /* VECTOR_H_ */

そして vector.cpp:

#include "vector.h"
#include "Maths.h"
#include "Target.h"
//vector::vector() {
//  // TODO Auto-generated constructor stub
//
//}

vector::vector(Target startTarget, Target endTarget) {
    double eastingTemp=endTarget.gpsX-startTarget.gpsX;
    double northingTemp=endTarget.gpsY-startTarget.gpsY;
    double altitudeTemp=endTarget.gpsZ-startTarget.gpsZ;
    double vecMagnitude=sqrt(pow(eastingTemp,2)+pow(northingTemp,2)+pow(altitudeTemp,2));
    easting=eastingTemp/vecMagnitude;
    northing=northingTemp/vecMagnitude;
    altitude=altitudeTemp/vecMagnitude;
}

vector::vector(double targetsPitch, double targetsAzimuth) {

    easting=Maths::cosDeg(targetsPitch)*Maths::sinDeg(targetsAzimuth);
    northing=Maths::cosDeg(targetsPitch)*Maths::cosDeg(targetsAzimuth);
    altitude=Maths::sinDeg(targetsPitch);
}

vector::vector(vector normReactorVec, vector normSunVec) {

    double inclinationAngle=calculateInclinationAngle(normReactorVec,normSunVec);
    double normalMagnitude=2*Maths::cosDeg(inclinationAngle);
    easting=(normReactorVec.easting+normSunVec.easting)/normalMagnitude;
    northing=(normReactorVec.northing+normSunVec.northing)/normalMagnitude;
    altitude=(normReactorVec.altitude+normSunVec.altitude)/normalMagnitude;
}

double vector::calculateInclinationAngle(vector reactorVector,vector sunVector) {

    double angleResult=(reactorVector.easting*sunVector.easting)
            + (reactorVector.northing*sunVector.northing)
            + (reactorVector.altitude*reactorVector.altitude);
    double inclinationAngleDoubled=Maths::arccos(angleResult);
    double inclinationAngle=inclinationAngleDoubled/2.0;
    return inclinationAngle;
}

double vector::getPitch(vector helioNormalVec) {
    double pitch=Maths::arcsin(helioNormalVec.altitude);
    if (pitch<0){
        pitch=0;
        Serial.println(F("error on pitch calc"));
    }
    return pitch;
}

double vector::getAzimuth(vector helioNormalVec) {

    double pitch=getPitch(helioNormalVec);
    double theta=Maths::arcsin(helioNormalVec.easting/Maths::cosDeg(pitch));
    //taking absolute of theta function abs() get only int as operators
    if (theta<0){
        theta=-theta;
    }

    double azimuth;
    if (helioNormalVec.easting>0){
        if(helioNormalVec.northing>0){
            azimuth=theta;
        }else if(helioNormalVec.northing<0){
            azimuth=180-theta;
        }else{
            azimuth=90;
        }
    }else if(helioNormalVec.easting<0){
        if(helioNormalVec.northing>0){
            azimuth=360-theta;
        }else if(helioNormalVec.northing<0){
            azimuth=180+theta;
        }else{
            azimuth=270;
        }
    }else{
        if(helioNormalVec.northing>0){
            azimuth=0;
        }else if(helioNormalVec.northing<0){
            azimuth=180;
        }else{
            Serial.println(F("error on Azimuth calc"));
        }
    }
    return azimuth;
}

vector::~vector() {
    // TODO Auto-generated destructor stub
}

太陽クラスについては、double を返す 2 つの関数を使用するだけです。この時点では、スケッチはありません。プログラムが何かを実行するとは思わないので、構文エラーがないかどうかを確認しています。

私が得るエラーは次のように言っています:

'Sun::getPitch1year' is not a type

getAzimuth1yearArcsin()、TargetCatalog::r​​ectorTarget、TargetCatalog::heliostatTarget、reactVec、sunsVec についても同様です。ヘリオスタット ヘッダーの最初の行。

Target heliostat(4501472.0,662766.0,1.0); 
Target reactor(4501474.0,662768.0,30.0);

次のような構文エラーが表示されます:数値定数の前に「,」または「...」が必要です

これらの問題について解決策はありますか?

4

1 に答える 1

0

heiliostat.h の行

Vector sunsVec(Sun::getPitch1year(),Sun::getAzimuth1yearArcsin());

sunsVec という名前の関数を宣言し、それが取るを宣言する必要があります。現在のコードは 2 つの関数を呼び出そうとしています。

Sun::getPitch1year() を関数が返す型に置き換え、Sun::getAzimuth1yearArcsin()) に対して同じことを行います。

于 2013-07-02T02:33:25.187 に答える