将函数指针从Arduino传递给C ++

时间:2016-08-04 11:32:15

标签: c++ arduino

这个问题是关于C++,但它与Arduino互动,因为我不是软件人,所以我很乐意看到其他人。 我已经知道它出了一个舒适区,并且会吸引仇敌,但是如果你其中一个想帮助我弄清楚如何做到这一点,我将不胜感激。

Arduino中,用户创建一个类的实例并设置其委托方法:

Arduino main program:

    //instance
    Main interpreter;
    //set delegate
      interpreter.setDelegate(intepreterDelegate);
    //delegate function
         float intepreterDelegate(char *arg){return 3;}

Main类,然后创建另一个类的实例,名为Sub,所以:

Sub - > send delegate to Main-> send delegate to Arduino

Main成功获得来自Sub的委托邮件:

Main.h

  //being called from the sub
   static float fromSubDelegate(char *arg){

        // *Here I am trying to push forward this delegate out to the user on arduino
        Main. b;   
        float result = (b.*b.fpAction)(arg);
        return  result;


     };

    float (Main.::*fpAction)(char*) = 0 ;
    void setDelegate( float(*fp)(char*));

问题在于Main.cpp,我设置了委托

//arduino set this delegate of the main class .cpp
void Main.::setDelegate( float(*fp)(char*))
{

    fpAction = fp; // *gives error because fpAction is a member function

}

我提供了所有数据。 我不是一个C ++程序员,我可能会做错的事情,所以 我正在寻求帮助

2 个答案:

答案 0 :(得分:3)

这不是你在另一个问题中提出的问题。 你在adruino代码中所做的事情(你似乎)之间存在不匹配 以及你想要的C ++代码。

您无法将代理从非成员函数更改为成员函数 和 你在它使用的类之外​​定义一个成员函数(即委托)。

你正在尝试的东西目前没有意义。 你的arduino定义了一个实例

Main interpreter;

然后在解释器实例中定义和设置委托(确定为止)。

但是在fromSubDelegate()中你创建了一个新的实例b。 你可能在解释器实例中设置的任何代理都不会在b实例中设置,除非函数指针是静态的,但在这种情况下你甚至不需要fromSubDelegate()函数,你可以只是直接调用函数指针。

你似乎对事物的运作方式有错误的认识。要带回家的是,如果你有一个类的非静态成员函数,那么有一个隐藏的额外参数,你可以在函数中使用它作为' this'。 所以你定义的成员函数是

class X
{
    void func(int i);
}

不同
void func (int i);

在课堂外定义。它实际上更类似于void

func(X* this, int i); 

虽然这在语义上是正确的,但它并不是语法上的。

答案 1 :(得分:0)

感谢oreubens的帮助,我找到了一个解决方案 - 只是直接从main传递给sub,这是函数的指针,所以:

void Main::setDelegate( float(*fp)(char*))
{
    fpAction=fp;
    sub->setDelegate(fpAction);



}

效果很好。再次感谢。