簡體   English   中英

通過范圍解析運算符arduino傳遞函數指針

[英]Passing function pointer with scope resolution operator arduino

我是arduino和編程的新手。 我在arduino的自己的庫中包含一個庫,但是第一個庫包含一個函數,該函數具有指針函數作為參數。 這是一個中斷服務程序(ISR),但是發生中斷時,我需要在cpp文件中調用一個函數。 因此,我需要將該函數的指針傳遞給第一個庫代碼。 當我在.ino文件中使用它時效果很好,我可以像這樣傳遞它,

attachInterrupt(functionISR_name);

但是當我在.cpp文件中使用它時,出現錯誤。 我的功能就像

void velocity::functionISR_name(){
//some code
}

但是如何將這個函數的指針傳遞給第一個庫函數呢? 我嘗試過這種方法,但出現錯誤,

attachInterrupt(velocity::functionISR_name);

除非將其靜態定義,否則無法將方法傳遞給需要該功能的函數。

靜態地寫:

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需要更多參數),然后復制並粘貼錯誤消息。 通常,錯誤在您不懷疑的地方是准確的。 這個問題是個例外。 通常,我和其他人會要求更好的規范。

您將指針傳遞給該函數,但該函數是類成員。 調用可能無效,因為this指針將是垃圾(可以正常編譯,但在運行時會引發奇怪的錯誤)。

您需要在任何類之外定義一個普通的香草函數,然后使用它。 如果您沒有一個非常復雜的項目,則可以使用全局指針指向您應該使用的類實例,而只需在新函數中委派調用即可。 如果您想以正確的方式進行操作,則需要某種機制來獲取我在上面討論的實例指針。 通常,這涉及單例或某種工廠模式。

例:

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傳遞給該函數。 它將起作用,因為您現在還this指針傳遞了foo_instance

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM