簡體   English   中英

如何在導入另一個庫的庫中修復“非靜態成員函數的無效使用”

[英]How to fix “invalid use of non-static member function” in a library importing another library

我正在為arduino寫一個庫,該庫必須在固定延遲后不使用delay函數的某個時刻調用該函數。

由於不包括標准的c ++庫,因此我必須使用arduino庫,我選擇了FlexiTimer2,它對於每X個時間單位運行一個函數很有用(這只是一個介紹,問題與arduino不相關,而與c ++相關)。

.h文件

#ifndef StepperDriverController_h
#define StepperDriverController_h

#include <stdlib.h>
#if ARDUINO >= 100
#include <Arduino.h>
#else
#include <WProgram.h>
#include <wiring.h>
#endif

class StepperDriverController
{
    public:
        StepperDriverController(unsigned char step, unsigned char direction);

        void setPulseWidth(unsigned short width);
        // other methods

    protected:
        void stepPinDown();
        void step(bool blocking = true);

    private:
        unsigned char _pins[2];
        // some attributes
};
#endif

.cpp文件

#include "StepperDriverController.h"
#include <Thread.h>

void StepperDriverController::stepPinDown()
{
    digitalWrite(_pins[0], LOW);
    FlexiTimer2::stop();
}

void StepperDriverController::setPulseWidth(unsigned short width)
{
    _pulseWidth = width;
    FlexiTimer2::set(width, 1/1000000, stepPinDown);
}

void StepperDriverController::step()
{
    digitalWrite(_pins[1], _direction ? HIGH : LOW);

    digitalWrite(_pins[0], HIGH);
    FlexiTimer2::start();
}

我在代碼FlexiTimer2 :: set(width,1/1000000,stepPinDown);無效地使用了非靜態成員函數 並且在此范圍內未digitalWrite(_pins [0],LOW)聲明“ _pins”

我已經閱讀了許多與此錯誤有關的問題,但無論如何都找不到解決方法

編輯

FlexiTimer不應實例化,而應像我一樣使用,如官方庫示例所示

嘗試使用的FlexiTimer2::set()重載聲明如下:

namespace FlexiTimer2 {
    // ...
    void set(unsigned long units, double resolution, void (*f)());
}

第三個參數是void (*f)() 這是指向自由函數的函數指針,該函數返回void並且不接受任何參數。 但是,您正在傳遞成員函數 這行不通。

然后,您嘗試將stepPinDown()從成員函數更改為自由函數。 這也不起作用,因為使其成為自由函數會阻止其訪問StepperDriverController的成員。

相反,您可以做的是傳遞一個lambda,您強制它與自由函數兼容(使用+語法),如下所示:

FlexiTimer2::set(width, 1/1000000, +[]{ /* your code here */ });

現在的問題是如何訪問StepperDriverController實例並在其上調用stepPinDown() 通常使用lambda,您只需對實例進行lambda捕獲:

[&obj]{ obj.stepPinDown(); }

但是,這樣的lambda無法傳遞給需要函數指針的函數。 +[]{ /* your code here */ }+表示法是為了明確表示lambda 不能捕獲任何內容。 如果不進行捕獲,則可以省略+ 它純粹是作為具有自我記錄和更清晰代碼的一種方式。

因此,由於不允許您執行lambda捕獲,並且我也不知道代碼的確切內部結構,因此尚不清楚如何在lambda中最好地調用stepPinDown() 但是似乎StepperDriverController是一個單例對象,這意味着它永遠只有一個實例。 因此,您可以擁有一個指向該實例的全局指針,並在lambda中使用它:

FlexiTimer2::set(width, 1/1000000, +[]{ globalInstance->stepPinDown(); });

我無法告訴您哪種解決方案適合您,但這就是要點。

還有一個與此無關的問題,但值得指出:

1/1000000

這並沒有按照您的想法做。 這是整數除法,結果將為0。您需要:

1.0/1000000.0

為了得到0.000001作為結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM