gpt4 book ai didi

c++ - 如何在导入另一个库的库中修复 "invalid use of non-static member function"

转载 作者:行者123 更新时间:2023-11-28 04:18:20 26 4
gpt4 key购买 nike

我正在为 arduino 编写一个库,它在某个时刻必须在固定延迟后调用一个函数而不使用延迟函数。

由于不包括标准 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);'_pins' 上得到非静态成员函数的无效使用未在 digitalWrite(_pins[0], LOW);

上在此范围内声明

我已经阅读了很多与此错误相关的问题,但还是找不到解决方法

编辑

FlexiTimer不应该被实例化,而是像我一样使用,如官方库所示example

最佳答案

您尝试使用的 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 不得 捕获任何事物。如果不进行捕获,可以省略 +;它纯粹是作为一种拥有 self 记录和更清晰代码的手段。

因此,由于不允许您执行 lambda 捕获,而且我不知道您的代码的确切内部结构,因此不清楚如何最好地调用 lambda 中的 stepPinDown()。但似乎 StepperDriverController 是一个单例对象,这意味着它只有一个实例。所以你可以有一个指向那个实例的全局指针并在 lambda 中使用它:

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

我无法告诉您适合您的情况的正确解决方案,但这是它的要点。

还有一个问题与这些无关,但值得指出:

1/1000000

这并不像您认为的那样。这是整数除法,结果将为 0。您需要:

1.0/1000000.0

为了得到 0.000001 作为结果。

关于c++ - 如何在导入另一个库的库中修复 "invalid use of non-static member function",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56064923/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com