繁体   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