2016-08-04 126 views
0

這個問題是關於C++,但它與Arduino交互,由於我不是一個軟件傢伙,我會很樂意得到任何其他人的看法。 我已經知道它出了一個舒適的區域,並會吸引仇敵,但如果你想幫助我弄清楚如何做到這一點,將不勝感激。從Arduino傳遞函數指針到C++

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其中I設置委託

//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 

} 

我已經提供的所有數據I HAVE。 我不是一個C++程序員,所以我可能是做錯了事情,所以 我要求幫助

回答

0

感謝的oreubens的幫助下,我找到了解決辦法 - 只要直接從主傳遞到子,指針的函數,所以:

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



} 

的偉大工程。再次感謝 。

+0

你應該標記他的帖子作爲答案然後 – djUniversal

2

這是不是真的是你在其他問題問。 您在adruino代碼 中的操作與您在C++代碼中想要的操作不匹配。

您不能將代理從非成員函數更改爲成員函數 和 您可以在其使用的類的外部定義成員函數(即委託)。

您正在嘗試的內容目前沒有意義。 您的Arduino定義實例

Main interpreter; 

它然後定義並設置委託(OK到目前爲止)在解釋實例。

但在fromSubDelegate()中創建一個新的實例b。 無論你在解釋器實例中設置了哪個委託,都不會在b實例中設置,除非函數指針是靜態的,但在這種情況下,你甚至不需要fromSubDelegate()函數,只需調用函數指針直接。

你似乎對事物的工作方式有錯誤的想法。要回家的是,如果您有一個類的非靜態成員函數,則會有一個隱藏的額外參數,您可以在函數內使用它作爲'this'。 所以一個成員函數定義爲

class X 
{ 
    void func(int i); 
} 

是不一樣的

void func (int i); 

一類的外部定義。它實際上更類似於void

func(X* this, int i); 

雖然這在語義上是「正確的」,但它不是在語法上。

+0

謝謝,我懷疑創建一個新的實例會導致這種情況。你幫了我很多。你可以請,展示如何使這件事情真正起作用? (直接調用指針?) – Curnelious

+0

我感到困惑和厭倦:(即使* fpAction是靜態的,其他類會如何知道它? – Curnelious