Class 从Arduino中的库调用主程序中的函数

Class 从Arduino中的库调用主程序中的函数,class,function,scope,call,arduino,Class,Function,Scope,Call,Arduino,我刚开始在Arduino制作图书馆。我创建了一个名为inSerialCmd的库。我想调用一个名为delegate()的函数,该函数在包含inSerialCmd库后在主程序文件stackedcontrol.ino中定义 当我尝试编译时,抛出一个错误: …\Arduino\libraries\inSerialCmd\inSerialCmd.cpp:在成员函数中 “void inSerialCmd::serialListen()”: …\Arduino\libraries\inSerialCmd\in

我刚开始在Arduino制作图书馆。我创建了一个名为inSerialCmd的库。我想调用一个名为delegate()的函数,该函数在包含inSerialCmd库后在主程序文件stackedcontrol.ino中定义

当我尝试编译时,抛出一个错误:

…\Arduino\libraries\inSerialCmd\inSerialCmd.cpp:在成员函数中 “void inSerialCmd::serialListen()”: …\Arduino\libraries\inSerialCmd\inSerialCmd.cpp:32:错误: 尚未声明“委托”

在做了一点搜索之后,似乎添加scope resolution操作符就可以了。因此,我添加了“:”before delegate(),now:::delegate()”,但抛出了相同的错误


现在我被难住了。

您不能也不应该直接从库中调用程序中的函数。请记住使库成为库的一个关键方面:

库不依赖于特定的应用程序。在不存在程序的情况下,库可以完全编译并打包到.A文件中

所以有一个单向依赖,一个程序依赖于一个库。乍一看,这似乎阻止你实现你想要的。您可以通过有时称为回调的方式来实现所要求的功能。主程序将在运行时向库提供指向要执行的函数的指针

// in program somwehere
int myDelegate(int a, int b);

// you set this to the library
setDelegate( myDelegate );
如果查看中断处理程序的安装方式,可以在arduino中看到这一点。这一概念存在于许多环境中——事件监听器、操作适配器——所有这些都具有相同的目标,即允许程序定义库无法知道的特定操作

库将通过函数指针存储和调用函数。下面是一个大致的草图:

// in the main program
int someAction(int t1, int t2) {
  return 1;
}

/* in library
this is the delegate function pointer
a function that takes two int's and returns an int */
int (*fpAction)(int, int) = 0;   

/* in library
this is how an application registers its action */
void setDelegate( int (*fp)(int,int) ) {
  fpAction = fp; 
}

/* in libary
this is how the library can safely execute the action */
int doAction(int t1, int t2) {
  int r;
  if( 0 != fpAction ) {
    r = (*fpAction)(t1,t2);
  }
  else {
    // some error or default action here
    r = 0;
  }
  return r;
}

/* in program
The main program installs its delegate, likely in setup() */
void setup () {
  ...      
  setDelegate(someAction);
  ...

非常感谢。这使事情更清楚了。我将研究函数指针。它不应该是setDelegate(someAction)@jdr5ca这是一个多么好的答案。最好的之一。希望我能给你点意见。