【问题标题】:Read string from double pointer C++ function with Python使用 Python 从双指针 C++ 函数中读取字符串
【发布时间】: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 的指针”我应该在此表上有一个指针传递给我的函数,但我该怎么做呢?

标签: python c pointers


【解决方案1】:

感谢@Some 程序员老兄,我已经解决了我的问题。谢谢你。

我需要声明一个表。但是devicesList 必须声明为c_char(不是c_char_p)的指针表,并且具有大小。由于我的函数需要指向表的指针,因此我添加了一个名为 pdevicesList 的指针,指向第一个原始表。我将这个指针用作函数的参数(通过引用)。

完整且功能齐全的 Python 代码如下:

  myDll= dllOpen(Dll)
  listDev = myDll.listDevices
  listDev.argtypes = [POINTER(POINTER(c_char_p)), POINTER(c_short)]
  n = c_short()
  devicesList = (POINTER(c_char)*10)()
  pdevicesList = devicesList[0]
  listDev(byref(pdevicesList),byref(n)) 
  for i in range(n.value):
     print ("-"+str(i)+": " + str(string_at(devicesList[i]),'utf-8'))

结果: -0:设备0 -1:设备1

完美!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-29
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多