【问题标题】:Passing function pointer from Arduino to C++将函数指针从 Arduino 传递到 C++
【发布时间】:2016-08-04 11:32:15
【问题描述】:

这个问题是关于 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++ 程序员,因此我可能做错了什么。

【问题讨论】:

    标签: c++ arduino


    【解决方案1】:

    这不是您在另一个问题中真正提出的问题。 您(似乎)在 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); 
    

    虽然这在语义上是“正确的”,但在语法上却不是。

    【讨论】:

    • 谢谢,我怀疑创建一个新实例会导致这种情况。你帮了我很多。你能告诉我如何让这件事真正发挥作用吗? (直接调用指针?)
    • 我很困惑,也很累 :( 即使 *fpAction 是静态的,像 sub 这样的另一个类怎么会知道呢?
    【解决方案2】:

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

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

    效果很好。再次感谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-03
      • 2011-05-22
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      • 2021-10-05
      • 2012-02-22
      • 1970-01-01
      相关资源
      最近更新 更多