我是arduino和编程的新手。 我在arduino中的库中包含了一个库,但是第一个库包含一个具有指针函数作为参数的函数。这是一个中断服务程序(ISR),但我需要在发生中断时调用cpp文件中的函数。所以我需要将该函数的指针传递给第一个库代码。当我在.ino文件中使用它时效果很好,我可以传递它,就像
一样attachInterrupt(functionISR_name);
但是当我在.cpp文件中使用它时,我会收到错误。我的功能就像,
void velocity::functionISR_name(){
//some code
}
但是如何将此函数的指针传递给第一个库函数?我试过这种方式但是出了错误,
attachInterrupt(velocity::functionISR_name);
答案 0 :(得分:3)
除非将其定义为静态,否则不能将方法传递给需要函数的函数。
写下静态:
static void velocity::functionISR_name()
和
attachInterrupt(&velocity::functionISR_name);
不幸的是,静态方法不再绑定到特定实例。您应该只与单身人士一起使用它。在Arduino上,您应该在代码剪辑中编写如下所示的类:
class velocity
{
static velocity *pThisSingelton;
public:
velocity()
{
pThisSingelton=this;
}
static void functionISR_name()
{
pThisSingelton->CallWhatEverMethodYouNeeded();
// Do whatever needed.
}
// … Your methods
};
velocity *velocity::pThisSingelton;
velocity YourOneAndOnlyInstanceOfThisClass;
void setup()
{
attachInterrupt(&velocity::functionISR_name);
// …other stuff…
}
这看起来很难看,但在我看来,Arduino完全没问题,因为这样的系统机会非常有限。
再次思考,我会亲自去索林在上面的回答中提到的方法。那将更像是:
class velocity
{
public:
velocity()
{
}
static void functionISR_name()
{
// Do whatever needed.
}
// … Your methods
};
velocity YourOneAndOnlyInstanceOfThisClass;
void functionISR_name_delegation()
{
YourOneAndOnlyInstanceOfThisClass.functionISR_name();
}
void setup()
{
attachInterrupt(functionISR_name_delegation);
// …other stuff…
}
它还可以为第一个示例中所需的指针节省一些字节。
作为网站备注:为了将来,请发布确切的代码(例如,attachInterrupt需要更多参数)并复制并粘贴错误消息。通常错误在您不怀疑的地方是准确的。这个问题是个例外。通常我和其他人会要求更好的规格。
答案 1 :(得分:1)
您传递一个指向该函数的指针,但该函数是一个类成员。可能调用将无效,因为this
指针将是垃圾(可能编译正常,但会在运行时抛出奇怪的错误)。
您需要在任何类之外定义普通的vanilla函数,并使用它。 如果你没有一个非常复杂的项目,你可以使用一个指向你应该使用的类实例的全局指针,并在新函数中委托调用。 如果你想以正确的方式做事,你需要一些机制来获取我上面谈到的实例指针。通常这涉及单身或一些工厂模式。
示例:
class Foo {
void method() {
x = 5;
}
int x;
}
对方法进行回调会崩溃,因为this
指针无效,因此x=5
会在内存中随机写入5。
你需要的是像:
static Foo* foo_instance; // Initialized somewhere else.
void method_delegator() {
foo_instance->method();
}
现在您可以将method_delegator
传递给该函数。它会起作用,因为你现在也传递了foo_instance
this
指针。