[완료] 함수 포인터의 선언과 사용 문제
글쓴이: qubick / 작성시간: 토, 2008/11/08 - 4:41오후
MFC 프로젝트를 만들어 코딩하고 있는데요,
(C++ 언어만 한 학기정도 공부하고 프로젝트는 처음 만들어보는데 생각보다 쉽지 않네요.
위자드가 있어서 쉬울 줄 알았건만 이벤트처리라는 개념 자체가 어려워서)
CHaptic_UIView* view; void (CHaptic_UIView::*pSenseDetect)(); pSenseDetect = &CHaptic_UIView::SensorDetect; SetTimer(1, 1000, (view->*pSenseDetect)());
라고 선언을 하고 SetTimer에서 사용하려는데
error C2664: 'SetTimer' : cannot convert parameter 3 from 'void' to 'void (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,unsigned long)' Expressions of type void cannot be converted to other types
와 같은 에러가 납니다;
제 컴파일러가 파라메터를 앞에서부터 받는지 뒤에서부터 받는지는 정확히 모르겠지만
에러 코드를 보아서는 앞에서부터 순서대로 함수 포인터 casting 문제인 것 같은데, 대체 어떻게 손을 써야 하는지 모르겠습니다.
이벤트 핸들러 써서 파라메터 4개짜리 Timer로도 써 보았고,
선언을 클래스 선언부에도 해 보았고, 전역으로도 해 보았는데 동문서답만 한듯;;
초저수, 간곡히 조언 부탁드립니다ㅠㅠㅠㅠ
Forums:
메세지로 봐서는...
교정(?) 감사합니다
하지만 선언만 저렇게 해 준다고 문제가 해결되진 않네요;;
애초에 포인터로 받아오려는 저 함수 자체의 파라미터가 저리 많지 않으니 말입니다.
완(전)소(용없는)녀
SetTimer가 win32 API의
SetTimer가 win32 API의 그거 맞죠? 그럼 인자를 저런 식으로 넘겨 줄 수 없습니다. 애초에 view 객체의 SensorDetect 메소드를 호출하도록 하려고 하신 거겠지만 C++에는 메소드와 그 기준이 되는 객체를 함께 담는 delegate나 closure 같은 기능이 없습니다. (보니까 별도의 자료를 넣을 수도 없겠네요.)
아마 외부 변수에다가 CHaptic_UIView 포인터를 저장해 놓은 뒤 FARPROC에 맞는 함수에서 그 포인터를 참조하도록 해야 할 것 같습니다. 멀티스레드 프로그램을 만드신다면 __declspec(thread)나 __thread 같은 걸로 스레드 지역 저장 장소를 써야 할 거고요. 제가 win32 API에 익숙하지 않아서 다른 방법이 있는진 모르겠지만 별 다른 방법이 없어 보입니다.
함수를 바꾸던지..
함수를 바꾸던지 아니면 타입 맞는 래퍼함수를 만들던지 해야 겠네요
SensorDetect 함수가 무슨 일을 하는 지 모르겠지만, setTimer의 세번째 인자는 WM_TIMER메세지를 받는 콜백함수니 콜백함수다워야 겠죠. 아니면 그냥 윈도우에 WM_TIMER메세지 핸들러에 SensorDetect를 호출하게 하면 간단하게 될지도 모르겠네요
예 그렇잖아도...
WM_TIMER 핸들러를 선언하고 ONTIMER 함수를 만들어 그 안에서 SensorDetect()를 호출하게 만들었습니다.
SensorDetect()가 실시간으로 계속 ATmega644p와 RF로 통신하며 보내주는 값을 받아(서 그래프로 뿌려지까지)오는 함수인지라
CALLBACK으로 선언했었는데도 잘 안 됐었거든요.
조언 감사합니다. 이제 다음 문제(?)로 넘어가야겠네요. ㅎㅎ
완(전)소(용없는)녀
댓글 달기