Wie übergibt man Zeiger zurück in die ctypes?
Weiß nicht viel über ctypes, gerade fing vor kurzem an zu arbeiten mit ihm.
Habe ich eine einfache Funktion, die in C-wie-dll-die gibt einen Zeiger auf den dynamisch generierten string.
Es ist in Ordnung, aber, weil ich manuell zugewiesenen Speicher für den string sollte ich frei nach Gebrauch.
Ich habe so etwas wie dieses:
extern "C" char* DLL_EXPORT func(const char* str1, const char* str2)
{
return getSomeString(str1, str2);
}
// Goal is to call this function correctly from Python.
extern "C" void DLL_EXPORT freeMem(void *mem)
{
if(mem!=NULL)
delete mem;
}
Aber ich habe keine Ahnung, wie kann ich den pass erhielt Zeiger wieder zum löschen in Python?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du bist auf dem richtigen Weg.
Und in python:
stringdup.restype
muss ein Zeiger-Typ, wiePOINTER(c_char)
da das Standard Ergebnis-Typ ist eine 32-bit -int
. Um ein Python-string, die Sie verwenden könnencast(p, c_char_p).value
oderc_char_p.from_buffer(p).value
.Normalerweise jede Funktion, die Sie verwenden in
ctypes
sollte seine Argumente und return-Typ deklariert, so dass Python kann überprüfen, ob die richtige Anzahl und Typ der Argumente und konvertieren Python-Objekt Argumente, um die richtige C-Daten-Objekte. Leider in diesem Fall, der normale return-Wert fürfunc
wärec_char_p
, aberctypes
versucht, hilfsbereit zu sein und konvertierenc_char_p
Rückgabewert einem Python-string, verlieren den Zugang zu den raw-C Zeiger Wert. Stattdessen können Sie deklarieren des Rückgabetyps alsc_void_p
und verwendencast
zum abrufen der string-Wert, der die Blätter der Rückgabewert einc_char_p
Objekt.Hier ist ein Beispiel (Python 3):