2011-12-15 40 views
2

我正在跟蹤三個顏色點 - 紅色,綠色和藍色。我有currentFrames類,其中包含幾幀 - 從相機和一些輔助幀 - 以及一些方法來操縱/從幀中提取一些信息。假設我能夠定位每個點的質心,然後我想根據此質心的位置調用特定的函數。整個框架被分成網格,並且網格的每個分段都會分配給它 - 當在這個特定的分段中檢測到點時,該功能將被調用。當我使用指針向成員呼叫成員函數時出現分段錯誤

我的想法是創建指針的多維數組成員函數:

#define CALL_MEMBER_FN(object,ptrToMember) ((object).*(ptrToMember)) 
MyFuncPointerType functions[NUMBER_OF_POINTS][NUMBER_OF_SEGMENTS]; 

,然後分配的函數的地址本,如:

functions[0][0] = &currentFrames::something; 

當,例如,第一個點將位於網格的第二部分,然後我會調用適當的函數(並且這將從currentFrames類中調用 - 這就是爲什麼我將*this作爲對象傳遞給CALL_MEMBER_FN

CALL_MEMBER_FN(*this, functions[0][1])(); 

我已經開始用不那麼複雜的例子 - 我想調用不同的功能,用於每個點,但同樣的每個段(「在點的範圍」):

class currentFrames 
{ 
    public: 
    void someMethod(); 

    private: 
    void calculateVelocity(); 
    void redPointDetected(); 
    void redPointGone(); 

    typedef void (currentFrames::*MyFuncPointerType)(); 
    MyFuncPointerType functions[]; 
} 

然後,在currentFrames的構造我做到以下幾點:

currentFrames::currentFrames() 
{ 
    this->functions[0] = &currentFrames::calculateVelocity; 
    this->functions[1] = &currentFrames::redPointDetected; 
} 

然後,在的someMethod類currentFrames我嘗試調用成員函數:

void currentFrames::someMethod() 
{ 
    CALL_MEMBER_FN(*this, this->functions[0])(); 
} 

但是這給了我segfault。我試圖將CALL_MEMBER_FN定義爲((ptrToObject)->*(ptrToMember)),但這也給了段錯誤。

這應該怎麼做?有沒有更好的方法來達到我想要的?

回答

8
MyFuncPointerType functions[]; 

你忘了給數組的長度。這將使其等於MyFuncPointerType *functions。指針初始化爲一些垃圾地址(可能爲0),並在構造函數中訪問this->functions[0]時導致段落。這與CALL_MEMBER_FN無關。

更改此行

MyFuncPointerType functions[2]; 

,它應該工作。 (演示:http://ideone.com/q4D3e

+1

omg,對我感到羞恥 - 看起來3am是一個比編程更好的時間,如果我找不到如此明顯的錯字!非常感謝! ;) – jmatraszek 2011-12-15 02:23:01