[英]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.