문제

포인터에서 플로트 어레이로 값을 얻으려고하지만 Python에서 C_VOID_P로 반환됩니다.

C 코드

double v;
const void *data;  
pa_stream_peek(s, &data, &length);  
v = ((const float*) data)[length / sizeof(float) -1];

지금까지 파이썬

import ctypes
null_ptr = ctypes.c_void_p()
pa_stream_peek(stream, null_ptr, ctypes.c_ulong(length)) 

NULL_PTR이라는 문제는 int 값 (메모리 주소?)을 가지고 있지만 배열을 읽을 방법이 없습니다!

도움이 되었습니까?

해결책

내 CTypes는 녹슬지 만 c_void_p 대신 포인터 (c_float)를 원한다고 생각합니다.

그러니 이것을 시도하십시오 :

null_ptr = POINTER(c_float)()
pa_stream_peek(stream, null_ptr, ctypes.c_ulong(length))
null_ptr[0]
null_ptr[5] # etc

다른 팁

C 코드를 모방하는 방식으로 CTYPES를 사용하려면 제안하겠습니다 (그리고 나는 실행 중이며 테스트되지 않았습니다).

vdata = ctypes.c_void_p()
length = ctypes.c_ulong(0)
pa_stream_peek(stream, ctypes.byref(vdata), ctypes.byref(length))
fdata = ctypes.cast(vdata, POINTER(float))

당신은 또한 아마도 byref를 사용하여 null_ptr을 통과하고 싶을 것입니다.

pa_stream_peek(stream, ctypes.byref(null_ptr), ctypes.c_ulong(length))

ctypes.pointer 또는 ctypes.byref를 사용하지 않고 포인터 인수를 전달하면 해당 내용이 단순히 메모리 주소의 정수 값 (즉, 포인터 비트)으로 설정됩니다. 이러한 주장은 함께 전달되어야합니다 byref (또는 pointer, 하지만 byref 오버 헤드가 적습니다) :

data = ctypes.pointer(ctypes.c_float())
nbytes = ctypes.c_sizeof()
pa_stream_peek(s, byref(data), byref(nbytes))
nfloats = nbytes.value / ctypes.sizeof(c_float)
v = data[nfloats - 1]
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top