2015-01-13 1 views
0

저는 파이썬을 C++로 확장하여 악기와 대화하려고합니다. 하지만 포인터 (및 버퍼)에 문제가 있습니다. 나는 C++/C 언어에 아직 익숙하지 않다.unsigned long * buffer

내 C 헤더 파일에서

, 나는 기능을 가지고 :

그래서 난 내 파이썬 모듈에서이 기능을 만들었습니다
long EXPORT read_output(long DeviceID, char* Buffer, unsigned long Length, unsigned long* BytesRead); 

:

static PyObject * 
Py_Get_ASCII(PyObject *self, PyObject *args) 
{ 
    long DeviceID; 
    char* Buffer; 
    unsigned long* BytesRead; 
    int param = PyArg_ParseTuple(args, "lz", &DeviceID, &Buffer); 
    //something for BytesRead (dont' know)*** 
    long response = read_output(DeviceID, Buffer, strlen(Buffer), BytesRead); 
    // * enter more code depending on value of response 
    Py_INCREF(Py_None); 
    return Py_None; 
} 

이 바보가 될 수도 있지만, 나는 혼란 스러워요 내가 어떻게 "unsigned long * BytesRead"를 해석하고 그에 대한 버퍼를 생성했는지에 관해서. 헤더 파일은 BytesRead가 읽은 바이트 수를 나타내는 것으로 가정합니다.이 바이트는 장치에서 읽은 것입니다. "BytesRead"를 통합하려고 할 때를 제외하고는 모든 것이 제대로 작동합니다. 내가해야 할 일에 대한 도움을 주시면 감사하겠습니다.

+0

[ctypes] (https://docs.python.org/2/library/ctypes.html)를 사용해 보셨습니까? – 101

+0

"C++/C"와 같은 언어가 없습니다. _ 사용중인 언어는 무엇입니까? 그런 다음 다른 태그를 제거하십시오. 감사. –

+0

@LightnessRacesinOrbit 괜찮 으면 도움이된다. 내 _answers를 comment_로 제거하면 어쨌든 답을 게시했습니다. –

답변

0

"버퍼"가 필요하지 않습니다.

는 전통적으로 당신은 실제 unsigned long이 다음에 포인터를 전달 인스턴스화 :

unsigned long BytesRead = 0; 
long response = read_output(DeviceID, Buffer, strlen(Buffer), &BytesRead); 
//               ^^^^^^^^^^ 

지금 BytesRead 읽을 바이트 수를 포함합니다.

이 기술은 out parameters으로 알려져 있으며 함수가 한 값만 반환 할 수 있다는 제한 사항을 해결합니다.

+1

좋아요! 그게 효과가 있었어. 나는 당신이 그것을 할 수 있다는 것을 몰랐다 ... – pikarawr

+0

더 우아한 솔루션을 사용하고있다. char * Buffer; ? 나는 그것을 인스턴스화하고 출력을 얻는 것을 시도했다 : char 버퍼 = ""; 긴 응답 = read_output (DeviceID, & Buffer, strlen (Buffer), BytesRead); 하지만 char을 char *로 변환 할 수 없다는 오류가 발생합니다. – pikarawr

0

read_output이 뭔가를 읽으려는 경우 BytesRead 매개 변수에서 읽은 바이트 수를 반환합니다. 이러한 이유 때문에 read_output은이 바이트 수를 저장할 위치에 대한 포인터를 원합니다. 그런 다음 호출 함수 Py_Get_ASCII에서 '부호없는 long BytesRead'로 선언하고 함수에 '& BytesRead'로 전달해야합니다.

관련 문제