我试图用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。"我很欣赏我应该做的一些帮助。
答案 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,并且解决了函数只能返回一个值的限制。