【发布时间】:2020-01-23 10:14:07
【问题描述】:
我用 C++ 开发了一个 DLL,我需要在 Python 中使用所有函数。由于我是 Python (3.x) 的新手,我在包装特定函数时遇到了问题。
这里是我的 DLL 中的 C 函数。此函数返回包含设备名称和设备数量的字符串表的地址。
char dev[10][16];
void listDevices(char **devices, short *number)
{
short n;
// Process which recover devices string and number, here 2 devices
...
n=2;
sprintf(dev[0],"%s","device0");
sprintf(dev[1],"%s","device1");
// Return the result
for(int i=0;i<n;i++) devices[i]=dev[i];
*number=n;
}
这里有一个 C 中的小程序(可以工作)来使用这个函数:
char *devicesList[10];
int n=0;
listDevices(devicesList, &n);
for (int i = 0; i < n; i++)
printf(" -%u: %s\n", i, devicesList[i]);
结果: - 0:设备0 - 1:设备1
现在我尝试在 Python 中做同样的事情,但我有一个来自编译器的“访问冲突写入”。这是我的 Python 小程序:
myDll= dllOpen(Dll)
listDev = myDll.listDevices
listDev.argtypes = [POINTER(c_char_p), POINTER(c_short)]
devicesList = POINTER(c_char_p)()
n = c_short()
listDev(devicesList,byref(nDev))
for i in range(n):
print (devicesList[i])
我认为我没有使用正确的字符串指针表声明。我不知道如何正确声明它,所以如果您有解决方案,我将不胜感激。
感谢您的帮助
【问题讨论】:
-
不太了解Python ctypes,这只是一个猜测,但我猜问题是
devicesList = POINTER(c_char_p)()。这是错误的,因为您将devicesList定义为指向指针的指针,而不是指针数组。 -
感谢您的回复。是的,你说得对,我认为这是主要问题,但我如何在不使用数组的情况下声明一个指针表(字符串)(否则我的函数不再兼容)?
-
有问题。在 C 代码中,您有一个指针数组。当您将数组传递给函数时,该数组会衰减为指向其第一个元素的指针。这就是
char **类型在 C 代码中工作正常的原因。我不知道数组衰减是如何使用ctype arrays 工作的(如果有的话),但你至少应该尝试使用它。 -
如果我将
devicesList声明为指针表,如下所示:devicesList = (POINTER(c_char_p)*10)()我有错误“预期 LP_c_char_p 实例而不是指向 LP_c_char_Array_10 的指针”我应该在此表上有一个指针传递给我的函数,但我该怎么做呢?