2015-01-13 3 views
0

Я пытаюсь расширить python на C++, чтобы поговорить с инструментом. Но у меня проблемы с указателями (и буферами). Я еще не знаком с языком C++/C.unsigned long * buffer

В моем заголовочном файле C, у меня есть функция:

long EXPORT read_output(long DeviceID, char* Buffer, unsigned long Length, unsigned long* BytesRead); 

Таким образом, я создал эту функцию в моем модуле Python:

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 OK хорошо, если это помогает. Удалив мои _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 *; ? Я пытался создать экземпляр, а затем получить вывод: char Buffer = ""; long response = read_output (DeviceID, & Buffer, strlen (Buffer) и BytesRead); Но я получаю сообщение о том, что я не могу преобразовать char в char * ... – pikarawr

0

Если read_output должен что-то прочитать, он, вероятно, вернет число байтов, считанных в параметре BytesRead. По этой причине read_output хочет указать указатель на место, где будет храниться это количество прочитанных байтов. Затем вы должны объявить его в своей вызывающей функции Py_Get_ASCII как «unsigned long BytesRead» и передать ее функции как «& BytesRead».

Смежные вопросы