2017-11-15 2 views
0

setCallback 함수를 사용하는 C 라이브러리로 작업하고 있습니다. 이러한 기능은 고정 된 서명, 예컨대 :와 기능을 mouse_move이 서명Cython의 C 함수에서 클래스/인스턴스 속성에 액세스하십시오.

void mouse_move(GLFWwindow * window, double xpos, double ypos) 

그러나 mouse_move을 가정이 camera 구조체처럼,이 함수 인수를 넘어 다른 상태에 따라 달라집니다

int glfwSetCursorPosCallback(window, mouse_move); 

? C에서 나는 단지 camera을 전역 변수로 만들 것이다. 그러나, 나는 Cython에서 일하고 있는데, 쓸모없는 지저분한 글로벌 변수를 사용하지 않고 glfwSetCursorPosCallback을 사용하고 싶습니다. camera이 클래스 또는 인스턴스 속성 인 경우 인수로 전달하지 않고 mouse_move에서 액세스 할 수 있습니까?

+1

이것은 실제로 Cython에서는 가능하지 않습니다. 나는 [비슷한 문제에 대해 ctypes를 사용하도록 권장했습니다.] (https://stackoverflow.com/questions/34878942/using-function-pointers-to-methods-of-classes-without-the-gil/34900829#34900829)를 사용하여 일반 파이썬 호출 가능 함수를 전달할 수 있지만 'GLFWwindow *'창 매개 변수를 사용하면 여기에서 수행하기가 어렵습니다. – DavidW

+0

또한 'GLFWwindow'를 사용하면 콜백에서 액세스 할 수있는 사용자 정의 데이터 (예 : void 포인터를 통해)를 저장할 수 있습니다. 이것은 물론 사용중인 라이브러리에 따라 다릅니다. 이것은 Cython과는 완전히 독립적입니다. –

답변

0

이 일반적인 문제에 대한 해결책이 아니라 glfw 콜백, 다음과 같이 GLFWwindowvoid*를 연결할 수 있습니다 :

glfwSetWindowUserPointer(window, yourVoidPtr); 

를 액세스 나중에 (예를 들어, 콜백에서) :

YourData *data = (YourData *) glfwGetWindowUserPointer(window); 
관련 문제