2017-05-08 3 views
1

나는 ctypes를 통해 파이썬에 C 라이브러리를 래핑합니다. 지금 나는 하나의 매개 변수에 한 줄 이상 붙어 있습니다. 여기에 C 코드 :파이썬 ctypes - 랩 무효 포인터

void* gVimbaHandleFake = (void*)1; 
err = VmbFeatureBoolGet(gVimbaHandleFake, "GeVTLIsPresent", &isGigE); 

이 이상한 무효 포인터입니다. 일반적으로 void 포인터가 무엇인지는 알지만이 포인터는 "특별한"것으로 보입니다. (void*)1에서 1을 변경하면 프로그램이 더 이상 작동하지 않습니다 (네트워크 카메라를 찾는 것입니다). 그것은 부서지는 것이 아니라 카메라를 더 이상 발견하지 못합니다.

나는 많은 다른 것들을, 파이썬의 마지막 시도를 시도 : 또한 "일반적인"방법을 시도
gVimbaHandle = cast(1, c_void_p) 
err = self.dll.VmbFeatureBoolGet(byref(gVimbaHandle), "GeVTLIsPresent", byref(isGigE)) 

:

gVimbaHandle = c_void_p(1) 

내 프로그램의 밤은 충돌하지만 핸들이 있음을 알려줍니다 유효하지 않습니다 ... gVimbaHandle.value으로 포인터를 살펴볼 때 1L이 출력됩니다. 이것이 문제가 될 수 있습니까? 긴 데이터 유형의 경우 L?

아무도이 문제를 해결하는 방법을 알고 있거나 C의 "특별"(void*)1 포인터를 설명 할 수 있습니까?

대단히 감사합니다!

gVimbaHandle = c_void_p(1) 
err = self.dll.VmbFeatureBoolGet(gVimbaHandle, "GeVTLIsPresent", byref(isGigE)) 

덕분에 당신은 참조로 포인터를 전달하는

+0

을 @eryksun하지만, 예를 들어 C 코드 값을 전달합니다 – eryksun

+0

오 그래 맞아, 파이썬과 C 포인터 조합의 것들과 혼란 스러웠다. 그리고 didnt는 이것을 보았다. .. 고맙습니다. 그것을 위해 고쳐졌습니다. u로 답변을 게시하면 솔루션으로 표시됩니다. 다시 한 번 감사드립니다. –

답변

1

그래서 해결책은/대답이다. `gVimbaHandle = c_void_p (1)`과`VmbFeatureBoolGet (gVimbaHandle, "GeVTLIsPresent", byref (isGigE))`를 사용하십시오.