unsigned long * buffer

时间:2015-01-13 07:40:23

标签: python pointers

我试图用C ++扩展python来与乐器交谈。但我在指针(和缓冲区)方面遇到了一些问题。我还是C ++ / C语言的新手。

在我的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。"我很欣赏我应该做的一些帮助。

2 个答案:

答案 0 :(得分:0)

如果read_output要读取内容,它可能会返回参数BytesRead中读取的字节数。因此,read_output需要一个指向它将存储读取的字节数的位置的指针。然后,您必须在调用函数Py_Get_ASCII中将其声明为“unsigned long BytesRead”,并将其作为“& BytesRead”传递给函数。

答案 1 :(得分:0)

您不需要任何“缓冲区”。

传统上你实例化一个实际的unsigned long然后传递指向它的指针:

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

现在BytesRead包含读取的字节数。

这种技术称为out parameters,并且解决了函数只能返回一个值的限制。