Чтение строки из функции двойного указателя C ++ с Python - PullRequest
1 голос
/ 23 сентября 2019

Я разработал DLL на C ++, и мне нужно использовать все функции с Python.Поскольку я новичок в Python (3.x), у меня есть проблема, чтобы обернуть определенную функцию.

Здесь функция C в моей DLL.Эта функция возвращает адрес таблицы строк, которая содержит название устройств и количество устройств.

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: device0 - 1: device1

Теперь я попытался сделать то же самое в 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])

Я думаю, что я не использую правильное объявление таблицы указателей на строку.Я не знаю, как правильно это объявить, поэтому если у вас есть решение, я буду очень признателен.

Спасибо за помощь

1 Ответ

0 голосов
/ 23 сентября 2019

Благодаря @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

Идеальный !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...