1

PIDというクラスがあります。クラスのヘッダーを #include します。エラーが指すファイルを含むさまざまなファイルでこのクラスを使用しています。コンパイラは、関数宣言自体の定義について不平を言いますvoid dispPid(char *name, PID &pid){}。関数の内容はすべてコメントアウトされています。AutoTrucker:-1: error: 'PID' has not been declaredエラーは、他のエラーなしで読み取られます。関数全体をコメントアウトすると、エラーが完全に削除され、コンパイルされて正常に動作します。

本当に混乱するのは、次のことです。

  1. エラーは行 -1 を指しています
  2. ファイルが存在し、含まれている
  3. 上記の PID クラスをポインターとして使用します。
PID *pid;
if (chk(arg2,"roll")){pid = &aircraft.ap.pid.wingLeveler;}
else if (chk(arg2,"heading") || chk(arg2,"hdg")){pid = &aircraft.ap.pid.headingHold;}
else if (chk(arg2,"pitch")){pid = &aircraft.ap.pid.pitchHold;}
...

すぐ上で指定されたこのコードは、コンパイルして正しく動作します。それで、何が得られますか?

編集 2: これは、私が病気になるようなジミー リグです。しかし、当分の間問題は解決します。それで、何が得られますか?コンパイラは、関数の引数として PID クラスを好みませんが、関数内では許容できると判断しますか? void ポインターを渡して変換するのではなく、これに対する適切な解決策を見つけたいと思います!

void dispPid(const char *name, void *tpid)
{
  PID &pid = *((PID*)tpid);
  ...
}

編集:(要求に応じてソースコードを追加します)

void cmdsPid(char *buffer)
{
  if (chk(buffer,"pid"))
  {
    char *arg1 = next(buffer);
    if (chk(arg1,"ls"))
    {
      char *arg2 = next(arg1);
      if (chk(arg2,"") || chk(arg2,"all"))
      {
        /*
        Serial.println("Listing all PIDs:");
        dispPid("Roll",aircraft.ap.pid.wingLeveler);
        Serial.print("\t");
        dispPid("Heading",aircraft.ap.pid,headingHold);
        dispPid("Pitch",aircraft.ap.pid,pitchHold);
        Serial.print("\t");
        dispPid("V-Rate",aircraft.ap.pid.climbHold);
        Serial.print("\t\t");
        dispPid("Altitude",aircraft.ap.pid.altHold);
        dispPid("Throttle",aircraft.ap.pid.throttleHold);
        dispPid("Slip",aircraft.ap.pid.slipHold);
        */
      }
      else
      {
        Serial.print("Unknown argument");
      }
    }
    else if (chk(arg1,"w"))
    {
      char *arg2 = next(arg1);//name
      char *arg3 = next(arg2);//attr
      char *arg4 = next(arg3);//val
      double val = 0.0;
      bool onoff = false;
      if (chk(arg3,"inv"))
      {
        onoff = (chk(arg4,"off") || chk(arg4,"-"));
      }
      else if (chk(arg3,"max") || chk(arg3,"min"))
      {
        if (chk(arg4,"off") || chk(arg4,"-"))
        {
          onoff = false;
        }
        else
        {
          onoff = true;
          val = parseDoubleArg(arg4);
        }
      }
      else
      {
        val = parseDoubleArg(arg4);
      }
      PID *pid;
      if (chk(arg2,"roll")){pid = &aircraft.ap.pid.wingLeveler;}
      else if (chk(arg2,"heading") || chk(arg2,"hdg")){pid = &aircraft.ap.pid.headingHold;}
      else if (chk(arg2,"pitch")){pid = &aircraft.ap.pid.pitchHold;}
      else if (chk(arg2,"vrate")){pid = &aircraft.ap.pid.climbHold;}
      else if (chk(arg2,"alt")){pid = &aircraft.ap.pid.altHold;}
      else if (chk(arg2,"th")||chk(arg2,"thr")||chk(arg2,"thro")||chk(arg2,"throttle")){pid = &aircraft.ap.pid.throttleHold;}
      else if (chk(arg2,"slip")){pid = &aircraft.ap.pid.slipHold;}
      if (chk(arg3,"p")){pid->setPGain(val);}
      else if (chk(arg3,"i")){pid->setIGain(val);}
      else if (chk(arg4,"d")){pid->setDGain(val);}
      else if (chk(arg4,"max"))
      {
        if (onoff){pid->setLimitMax(val);}
        else{pid->disableMaxLimit();}
      }
      else if (chk(arg4,"min"))
      {
        if (onoff){pid->setLimitMin(val);}
        else{pid->disableMinLimit();}
      }
    }
    else
    {
      Serial.println("Unknown argument");
    }
  }
}

void dispPid(char *name, PID &pid){}

PID クラス (ヘッダー):

#pragma once

#define PID_VERSION "1.1"

#include <inttypes.h>

#define allowLimitMax 1
#define allowLimitMin 2
#define invert 4
#define enabled 8

class PID
{
private:
    double pGain,iGain,dGain;
    double integrator;
    double *input,*output,*setpoint;
    double lastInput;
    double limitMax,limitMin;

    char settings;

public:
    struct Spid {
        double p,i,d,limitMax,limitMin;
        char settings;
    };

    PID();//constructor

    //getters
    double getPGain();
    double getIGain();
    double getDGain();
    double getLimitMax();
    double getLimitMin();
    bool isLimitMaxSet();
    bool isLimitMinSet();
    bool isInverted();

    //setters
    void setPGain(double newPGain);
    void setIGain(double newIGain);
    void setDGain(double newDGain);
    void setPIDGain(double newPGain, double newIGain, double newDGain);
    void setInput(double *newInput);
    void setOutput(double *newOutput);
    void setSetpoint(double *newSetpoint);
    void setIOS(double *newInput, double *newOutput, double *newSetpoint);
    void setLimitMax(double newLimitMax);
    void setLimitMin(double newLimitMin);
    void setLimits(double newLimitMin, double newLimitMax);
    void disableMaxLimit();
    void disableMinLimit();
    void disableLimits();
    void zeroOutIntegrator();
    void nullOut();
    void setInverted(bool newInvert);

    //actions
    void run();
    void run(double dt);

    void setFrom(Spid copy);
    void copy(Spid &copy);
};
4

0 に答える 0