[완료] 함수 포인터의 선언과 사용 문제

qubick의 이미지

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로도 써 보았고,
선언을 클래스 선언부에도 해 보았고, 전역으로도 해 보았는데 동문서답만 한듯;;

초저수, 간곡히 조언 부탁드립니다ㅠㅠㅠㅠ

Scarecrow의 이미지

	CHaptic_UIView* view;
	void (CHaptic_UIView::*pSenseDetect)(struct HWND__ *, unsigned int, unsigned int, unsigned long);
	pSenseDetect = &CHaptic_UIView::SensorDetect;
qubick의 이미지

하지만 선언만 저렇게 해 준다고 문제가 해결되진 않네요;;
애초에 포인터로 받아오려는 저 함수 자체의 파라미터가 저리 많지 않으니 말입니다.

완(전)소(용없는)녀

lifthrasiir의 이미지

SetTimer가 win32 API의 그거 맞죠? 그럼 인자를 저런 식으로 넘겨 줄 수 없습니다. 애초에 view 객체의 SensorDetect 메소드를 호출하도록 하려고 하신 거겠지만 C++에는 메소드와 그 기준이 되는 객체를 함께 담는 delegate나 closure 같은 기능이 없습니다. (보니까 별도의 자료를 넣을 수도 없겠네요.)

아마 외부 변수에다가 CHaptic_UIView 포인터를 저장해 놓은 뒤 FARPROC에 맞는 함수에서 그 포인터를 참조하도록 해야 할 것 같습니다. 멀티스레드 프로그램을 만드신다면 __declspec(thread)나 __thread 같은 걸로 스레드 지역 저장 장소를 써야 할 거고요. 제가 win32 API에 익숙하지 않아서 다른 방법이 있는진 모르겠지만 별 다른 방법이 없어 보입니다.

kaeri17의 이미지

함수를 바꾸던지 아니면 타입 맞는 래퍼함수를 만들던지 해야 겠네요

SensorDetect 함수가 무슨 일을 하는 지 모르겠지만, setTimer의 세번째 인자는 WM_TIMER메세지를 받는 콜백함수니 콜백함수다워야 겠죠. 아니면 그냥 윈도우에 WM_TIMER메세지 핸들러에 SensorDetect를 호출하게 하면 간단하게 될지도 모르겠네요

qubick의 이미지

WM_TIMER 핸들러를 선언하고 ONTIMER 함수를 만들어 그 안에서 SensorDetect()를 호출하게 만들었습니다.
SensorDetect()가 실시간으로 계속 ATmega644p와 RF로 통신하며 보내주는 값을 받아(서 그래프로 뿌려지까지)오는 함수인지라
CALLBACK으로 선언했었는데도 잘 안 됐었거든요.
조언 감사합니다. 이제 다음 문제(?)로 넘어가야겠네요. ㅎㅎ

완(전)소(용없는)녀

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.