Ошибка при использовании обратного вызова в 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 раз)