Ошибка использования обратного вызова в Python

Я разрабатываю dll, который должен использоваться в Python. У меня есть функция обратного вызова для отправки моих параметров (определенных в отдельном заголовке):

typedef int(*call_nBest)(char **OutList, float* confList, int nB);

Итак, я использую этот обратный вызов следующим образом:

 #define TEXT_BUFFER_MAX_SIZE 50 call_nBest nBestList; void Xfunction(const char* aLineThatWillBeConvertedInAList){ char **results; float *confidences; confidences=new float[nBest]; results=new char*[nBest]; for(int i=0; i<nBest; i++) results[i]=new char[TEXT_BUFFER_MAX_SIZE]; MakeLine2List(aLineThatWillBeConvertedInAList,results,confidences); /*At this function I am having the error :(*/ nBestList(results,confidences,nBest); // Passing the values to my callback for(int i=0; i<nBest; i++) delete [] results[i]; delete [] confidences; delete [] results; } 

И я экспортирую его таким образом:

 __declspec(dllexport) int ResultCallback(call_nBest theList){ nBestList = theList; return(0); } 

Я проверил свой обратный вызов сначала в другом приложении на C ++ следующим образом:

 int MyCallback(char **OutLi, float* confLi, int nB){ printf("\n The nB results: %d \n",nB); for(int n=0; n<nB; n++){ std::cout << *(confLi+n) << "\t" << OutLi[n] << "\n"; } return(0); } 

В main() я вызываю обратный вызов следующим образом:

 ResultCallback(MyCallback); 

и это работает очень хорошо. Но я не знаю, как адаптировать это к Python. Я пробовал это:

Примечание. Я изменил последний способ, потому что я разрешил некоторые ошибки, но я все еще получаю сообщение об ошибке. Это текущий способ загрузки myDLL

 from ctypes import * def callbackU(OutList,ConList,nB): for i in range(nB): print(OutList[i][0:50]) #I don't know how to print the values return 0 myDLL = cdll.LoadLibrary("MyLibrary.dll") calling = CFUNCTYPE(c_int,POINTER(POINTER(c_char)),POINTER(c_float),c_int) theCall= calling(callbackU) myDLL.ResultCallback(theCall) myDLL.StartProcess(); #In this process the given callback will be invoqued 

ОШИБКА

И теперь у меня есть эта ошибка:

Необработанное исключение: System.AccessViolationException: попытка чтения или записи защищенной памяти. Это часто свидетельствует о том, что другая память повреждена. в Xfunction (SByte * aLineThatWillBeConvertedInAList)

Подпись задачи:

Проблема Название события: APPCRASH
Название приложения: python.exe
Версия приложения: 0.0.0.0
Временная метка приложения: 54f9ed12
Имя модуля неисправности: MSVCR100.dll
Версия модуля неисправности: 10.0.40219.325
Временная метка: 10.0.40219.325
Код исключения: c0000005
Смещение смещения: 00001ed7
Версия ОС: 6.3.9600.2.0.0.256.4
Locale ID: 1033
Дополнительная информация 1: 5861
Дополнительная информация 2: 5861822e1919d7c014bbb064c64908b2
Дополнительная информация 3: a10f
Дополнительная информация 4: a10ff7d2bb2516fdc753f9c34fc3b069

Вещи, которые я сделал, и почти то, что я хочу:

Сначала я изменил функцию Python обратного вызова для этого:

 def callbackU(OutList,ConList,nB): for i in range(nB): print(i) return 0 

Все работает без ошибок, и я вижу это на консоли (в этом случае nB было 10 ):

 0 1 ... 9 

Во-вторых, я изменил функцию следующим образом:

 def callbackU(OutList,ConList,nB): for i in range(nB): print (cast(OutList,c_char_p)) return 0 

и, к удивлению, это печатает только первое слово списка (nB раз)

One Solution collect form web for “Ошибка использования обратного вызова в Python”

Вы хотите что-то подобное?

 def callbackU(OutList, ConList, nB): for i in range(nB): print("{}\t{}".format(ConList[i], cast(OutList[i], c_char_p))) return 0 

Насколько я понимаю, вы просто пытаетесь сопоставить вывод функции callbackU Python с вашей функцией C ++ MyCallback .

Python имеет множество функций форматирования строк, которые могут сбивать с толку вначале, но отдает дань уважения форматированию строк printf .

Поскольку OutList имеет тип LP_LP_c_char (указатель на указатель c_char , vs "NULL terminated char * " c_char_p ), мы бы лучше превратили его в собственный тип данных Python, например:

 def callbackU(OutList, ConList, nB): for i in range(nB): out_list_item = cast(OutList[i], c_char_p).value print("{}\t{}".format(ConList[i], out_list_item)) return 0 
  • Используйте Boost-Python для вычисления производной функции, определенной в python
  • Многопоточность с Python и C api
  • Boost :: Python - возможно автоматическое преобразование из dict -> std :: map?
  • Как добавить свойство к модулю в boost :: python?
  • Как я могу анализировать макросы в коде C ++, используя CLANG в качестве синтаксического анализатора и Python в качестве языка сценариев?
  • СинтаксисError с scipy.weave.inline
  • Запустите определенную функцию Python в C # с помощью IronPython
  • Почему операции std :: string работают плохо?
  • Абстрактные классы (с чистыми виртуальными методами) в Китоне
  • Предоставление элемента данных массива C-стиля для Python через Boost.Python
  • анализировать и изменять имена хостов
  •  
    Interesting Posts for Van-Lav

    Python Запись в текстовый файл Словарь Показывает неправильную информацию

    Matplotlib: заполненный контурный график с прозрачными цветами

    Python (Pandas) Добавить промежуточный итог на каждый lvl мультииндекса данных

    Ошибка установки Python: пакет NumPy

    Как нарисовать систему координат поверх изображения с помощью tkinter?

    Установка OpenCV 3 для Python 3 на Mac с использованием Homebrew и pyenv

    Доступ к переменной внутри метода класса

    Как я могу войти в API для просмотра Django Rest, когда у меня есть пользовательская модель auth?

    python os.rename (…) не будет работать!

    Найти гиперссылки в тексте с помощью Python (связанный с Twitter)

    defaultdict не определен

    Как делиться концепциями бизнеса на разных языках программирования?

    Повторное использование кода из разных IPython-ноутбуков

    Кто-нибудь знает какие-либо двигатели репутации пользователя?

    Как удалить пробелы во время записи в INI-файле – Python

    Python - лучший язык программирования в мире.