2014-09-02 93 views
0

我使用AccelStepper庫在我的Arduino的項目,該庫有一個構造函數,與功能參數:傳遞一個類的成員函數:類型發出

AccelStepper(void (*forward)(), void (*backward)()); 

在主草圖,這是所使用的代碼:

void forwardstep() { 
    AFstepper->onestep(FORWARD, stepType); //some code to move the motor 
} 
void backwardstep() { 
    AFstepper->onestep(BACKWARD, stepType); //some code to move the motor 
} 
AccelStepper stepper(forwardstep, backwardstep); 

只要這段代碼在主草圖中,一切正常。

我已經創建了具有AccelStepper對象和forwardstep()和backwardstep()函數作爲成員的一類,但我無法通過功能AccelStepper的構造: h文件:

#define IICADDRESS 0x60 

class FilterWheel : public Device 
{ 
public: 
    FilterWheel(); 

    void forwardstep(); 
    void backwardstep(); 
    void (*fwdstp)();  //function pointer 
    void (*bckwdstp)(); //function pointer 
private: 
    //Adafruit Motor Shield object 
    Adafruit_MotorShield AFMS; 
    //Adafruit Stepper Motor object 
    Adafruit_StepperMotor *AFstepper; 
    //AccelStepper wrapper 
    AccelStepper stepper; 
}; 

.cpp文件:

#include "FilterWheel.h" 

//constructor 
FilterWheel::FilterWheel() 
{ 
    fwdstp = &FilterWheel::forwardstep; 
    bckwdstp = &FilterWheel::backwardstep; 

    Adafruit_MotorShield AFMS (IICADDRESS); 
    Adafruit_StepperMotor *AFstepper = AFMS.getStepper(200, 1); //M1 M2 
    //AccelStepper stepper(forwardstep, backwardstep); //doesn't work 
    AccelStepper stepper(fwdstp, bckwdstp);    //works only if fwdstp = &FilterWheel::forwardstep; and bckwdstp = &FilterWheel::backwardstep; are commented out 
} 

//go 1 step forward 
void FilterWheel::forwardstep() { 
    AFstepper->onestep(FORWARD, stepType); 
} 
//go 1 step backward 
void FilterWheel::backwardstep() { 
    AFstepper->onestep(BACKWARD, stepType); 
} 

當我嘗試直接傳遞的功能,

AccelStepper stepper(forwardstep, backwardstep); 

編譯器顯示以下錯誤:

FilterWheel.cpp:34: error: no matching function for call to 'AccelStepper::AccelStepper(<unresolved overloaded function type>, <unresolved overloaded function type>)' 
AccelStepper.h:AccelStepper(void (*)(), void (*)()) 
AccelStepper.h:AccelStepper(uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, bool) 
AccelStepper.h:AccelStepper(const AccelStepper&) 
Error compiling 

當我連接功能的函數指針,

fwdstp = &FilterWheel::forwardstep; 
    bckwdstp = &FilterWheel::backwardstep; 
    AccelStepper stepper(fwdstp, bckwdstp); 

編譯器顯示這些錯誤:

FilterWheel.cpp:In constructor 'FilterWheel::FilterWheel()' 
FilterWheel.cpp:22: error: cannot convert 'void (FilterWheel::*)()' to 'void (*)()' in assignment 
FilterWheel.cpp:23: error: cannot convert 'void (FilterWheel::*)()' to 'void (*)()' in assignment 
Error compiling 

如何解決這個問題?

+0

像'void(* forward)()'這樣的變量可以接受指向獨立非成員函數或靜態成員函數的指針。它不會與非靜態成員函數一起工作 - 它不知道要調用它的對象。 – 2014-09-02 23:53:57

回答

0

forwardstep()backwardstep()爲非靜態成員函數,所以這fwdstp = &FilterWheel::forwardstep;是指向成員函數,它不能被轉換爲指針的功能,因爲它需要一個對象調用它。

你必須使你的函數是靜態的或獨立的。

+0

我也想過這個。我寧願不使用靜態或獨立函數,因爲我認爲它會使代碼更加複雜。 在我的研究期間,我發現這篇文章[鏈接] http://stackoverflow.com/a/402385(和進一步,[鏈接] http://stackoverflow.com/questions/282372/demote-boostfunction-toa-a-簡單功能指針)似乎是我的問題的解決方案。不幸的是,我不能使用綁定(未在此範圍內聲明),儘管安裝了arduino庫的增強功能。 – wergor 2014-09-03 11:44:24

+0

@wergor問題在於你必須傳遞實際的指針給函數,'boost :: bind'不會幫助你。第二個問題是這些函數是無參數的,即它們只能從某個全局對象或某個類的靜態成員中獲取狀態。 – 2014-09-03 11:52:31

相關問題