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
ERRO

Und 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

Dinge, die ich getan habe und die fast das sind, was ich will:

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)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage