2011-12-15 6 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 클래스 내부에서 호출 될 것입니다.) 그래서 CALL_MEMBER_FN에 대한 객체로 *this을 전달하고 있습니다 :

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; 
} 

그럼,이 멤버 함수를 호출하려고 currentFrames 클래스의 것으로 someMethod에서 :

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

그러나 이것은 나에게 segfault를줍니다. CALL_MEMBER_FN((ptrToObject)->*(ptrToMember))으로 정의하려고 시도했지만 segfault도 제공합니다.

어떻게해야합니까? 내가 원하는 것을 얻기위한 더 좋은 방법이 있습니까?

답변

8
MyFuncPointerType functions[]; 

배열의 길이를 잊어 버렸습니다. 그러면 MyFuncPointerType *functions과 같아집니다. 포인터는 생성자에서 this->functions[0]에 액세스 할 때 일부 가비지 주소 (아마도 0)로 초기화되고 세그먼트를 발생시킵니다. 이것은 CALL_MEMBER_FN과 아무 관련이 없습니다.

변경

MyFuncPointerType functions[2]; 

하고 작동해야이 라인. (데모 : http://ideone.com/q4D3e)

+1

나를 부끄러워하지 말라 - 나는 명백한 오타를 찾을 수 없다면 3am이 프로그래밍을하는 것보다 더 나은 시간 인 것 같다! 고마워요! ;) – jmatraszek

관련 문제