0

ライブラリ (file.cpp + file.h) を Arduino にビルドしようとしましたが、次のエラーが発生しました。

EXAMPLE_MPL3115A2.ino:2 からインクルードされたファイル: /Applications/Arduino.app/Contents/Resources/Java/libraries/MPL3115A2/MPL3115A2.h:8: エラー: ISO C++ はタイプのない「getPressure」の宣言を禁止します EXAMPLE_MPL3115A2.ino:関数 'void loop()': EXAMPLE_MPL3115A2:18: エラー: '.' の前に非修飾 ID が必要です トークン

エラーがどこにあるのか説明できますか?? (C++はよくわかりません)

ここに私のMPL3115A2.hがあります

#ifndef MPL3115A2_h
#define MPL3115A2_h

#include "Arduino.h"

class MPL3115A2{
public:
  getPressure();
private:
  int m_i2c_address;
  byte _p_msb, _p_csb, _plsb;
  byte _tempp, _tempa, _tempt, _decimalPress, _decimalAlt, _decimalTemp;
  unsigned long _ptot;
};

#endif  

私のMPL3115A2.cpp

#include "Arduino.h"
#include "MPL3115A2.h"
#include "I2C.h"



MPL3115A2::MPL3115A2()
{
        m_i2c_address = 0x60;
        p_msb = _p_msb;
    p_csb = _p_csb;
    p_lsb = _p_lsb;
        tempp = _tempp;
    tempa = _tempa;
    tempt = _tempt;
    decimalPress = _decimalPress;
    decimalAlt = _decimalAlt;
    decimalTemp = _decimalTemp;
        ptot = _ptot;
}

float MPL3115A2::getPressure()
{
  I2c.write(m_i2c_address,0x26,0x00);
  I2c.write(m_i2c_address,0x26,0x01); 
  delay(100);
  I2c.read(m_i2c_address,0x1,3);
  I2c.end();
  while(I2c.available()){
  p_msb=I2c.receive(); 
  p_csb=I2c.receive(); 
  p_lsb=I2c.receive();}
    ptot=p_msb;
  ptot=(ptot<<8)+p_csb;
  ptot=(ptot<<2)+(p_lsb>>6);
  tempp=(p_lsb<<2);
  if(tempp==192){
    decimalPress=75;
  }else if(tempp==128){
    decimalPress=25;
  }else if(tempp==64){
    decimalPress=5;
  }else{tempp=0;}
  Serial.print(ptot);
  Serial.print(".");
  Serial.println(decimalPress);
}

#endif

そして私のexample.pde

#include <Arduino.h>
#include <MPL3115A2.h>
#include <I2C.h>

void setup(){
  Serial.begin(9600);
  I2c.begin();
}
//LOOP
void loop(){
  Serial.print("Pressure is: ");
  MPL3115A2.getPressure(); //Expressed in Pa
  Serial.print("Altimetry is: ");
  //MPL3115A2.getAltimetry(); //Expressed in m
  Serial.print("Temperature is: ");
 // MPL3115A2.getTemperature();  //Expressed in C
  delay(2000);
}

長文すみません!ご協力ありがとうございました!

4

2 に答える 2

2

getPressure()戻り値の型がありません! 投稿したcppによると、ヘッダーファイルはメソッドを宣言するfloat getPressure();必要があるため、ヘッダーファイルを次のように変更します。

#ifndef MPL3115A2_h
#define MPL3115A2_h

#include "Arduino.h"

class MPL3115A2{
public:
  float getPressure(); // <- only change here
private:
  int m_i2c_address;
  byte _p_msb, _p_csb, _plsb;
  byte _tempp, _tempa, _tempt, _decimalPress, _decimalAlt, _decimalTemp;
  unsigned long _ptot;
};

#endif 

である定義に対応する

float MPL3115A2::getPressure()
{
  // your processing code...
}

また、ヘッダーで宣言さconstructorれていないため、確認する必要があることに注意してください。また、次のようなことをします

p_msb = _p_msb;
p_csb = _p_csb;
p_lsb = _p_lsb;
tempp = _tempp;
tempa = _tempa;
tempt = _tempt;
decimalPress = _decimalPress;
decimalAlt = _decimalAlt;
decimalTemp = _decimalTemp;
ptot = _ptot;

本当に奇妙です。左の変数は何ですか?初期化されていないメンバー (右側の で始まるメンバー) でそれらを初期化しています_。これらのメンバーに初期値を与えることを検討する必要があります ( 0?)

コンストラクターを次のように変更します。

MPL3115A2::MPL3115A2()
{
    _p_msb = 0;
    _p_csb = 0;
    _p_lsb = 0;
    _tempp = 0;
    _tempa = 0;
    _tempt = 0;
    _decimalPress = 0;
    _decimalAlt = 0;
    _decimalTemp = 0;
    _ptot = 0;
}

メンバー変数が「既知の」値で初期化されていることを確認します。

また、これらの値のほとんどは一時的なようです ( の呼び出し以外では必要ない場合がありますgetPressure()。この場合、不要なメモリの使用を避けるために、これらすべてのバイトをセンサー クラス内ではなく関数のスコープに移動することを検討してください。 Arduinosで利用できるのはそれだけです。

MPL3115A2();また、クラスのpublic一部を追加する必要がありますMPL3115A2。これは、CPP ファイルでこのコンストラクターの本体を定義しているためです。したがって、オブジェクトの一部になるように宣言する必要があります。

于 2012-11-21T13:06:01.913 に答える
1

で実装するときにgetPressure()メソッドを戻り値の型で宣言する必要があると考えているため、ファイルには次のものが必要です。floatMPL3115A2.cpp'h

...
class MPL3115A2 {
    public:
        float getPressure();
        // (and remember the constructor)
    private:    
        ...
}

また、メソッドが実際には何もしないことを認識していreturnますか? それがアイデアである場合は、それを にして、それvoid getPressure()に応じてクラス定義を変更できます。

追加: 将来の読者のために、答えはエラーメッセージで入手できますが、不可解なものに隠されています: " ...ISO C++ forbids Declaration of 'getPressure' with no type ... "

それが役立つことを願っています。

于 2012-11-21T13:05:32.597 に答える