Fehler mit Rückruf in Python
Ich entwickle eine DLL, die in Python verwendet werden soll. Ich habe eine Rückruffunktion zum Senden meiner Parameter (in einem separaten Header definiert):
typedef int(*call_nBest)(char **OutList, float* confList, int nB);
Also, ich benutze diesen Rückruf auf diese Weise:
#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;
}
Und ich exportiere es auf diese Weise:
__declspec(dllexport) int ResultCallback(call_nBest theList){
nBestList = theList;
return(0);
}
Ich habe meinen Rückruf zuerst in einer anderen C ++ - Anwendung folgendermaßen getestet:
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);
}
Immain()
Ich gebe den Rückruf auf diese Weise:
ResultCallback(MyCallback);
und es funktioniert ziemlich gut. Aber ich habe keine Ahnung, wie ich das an Python anpassen soll. Ich habe es versucht:
Hinweis Ich habe den letzten Weg geändert, weil ich einige Fehler behoben habe, aber ich erhalte immer noch einen Fehler. Dies ist die aktuelle Art, wie ich lademyDLL
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
ERROUnd jetzt habe ich diesen Fehler:
Unhandled Exception: System.AccessViolationException: Es wurde versucht, geschützten Speicher zu lesen oder zu schreiben. Dies ist oft ein Hinweis darauf, dass ein anderer Speicher beschädigt ist. at Xfunction (SByte * aLineThatWillBeConvertedInAList)
Problemunterschrift:Problem Event Name: APPCRASH
Anwendungsname: python.exe
Application Version: 0.0.0.0
Anwendungszeitstempel: 54f9ed12
Fehler Modulname: MSVCR100.dll
Fault Module Version: 10.0.40219.325
Fault Module Timestamp: 10.0.40219.325
Ausnahmecode: c0000005
Exception Offset: 00001ed7
OS Version: 6.3.9600.2.0.0.256.4
Locale ID: 1033
Additional Information 1: 5861
Additional Information 2: 5861822e1919d7c014bbb064c64908b2
Additional Information 3: a10f
Additional Information 4: a10ff7d2bb2516fdc753f9c34fc3b069
Zunächst habe ich die Callback-Python-Funktion für diese geändert:
def callbackU(OutList,ConList,nB):
for i in range(nB):
print(i)
return 0
All funktioniert ohne Fehler und ich kann dies in der Konsole sehen (in diesem FallnB
war10
):
0
1
...
9
Zweitens habe ich die Funktion wie folgt geändert:
def callbackU(OutList,ConList,nB):
for i in range(nB):
print (cast(OutList,c_char_p))
return 0
und, oh, Überraschung, dies gibt nur das erste Wort der Liste aus (nB mal)