4 Stimmen

Wie erstelle ich einen Python-ctypes-Zeiger auf ein Array von Zeigern?

Ich muss lernen, wie man das char** in der untenstehenden C++ Methode durch Python ctypes handhaben kann. Bisher hat es gut geklappt, andere Methoden aufzurufen, die nur einfache Zeiger benötigen, indem ich create_string_buffer() benutzt habe, aber diese Methode erfordert einen Zeiger auf ein Array von Zeigern.

ladybugConvertToMultipleBGRU32(
         LadybugContext          context,
        const  LadybugImage * pImage,
        unsigned char**        arpDestBuffers,
         LadybugImageInfo *   pImageInfo  )

Wie erstelle ich in ctypes einen Zeiger auf ein Array von sechs create_string_buffer(7963648) Puffern, um sie an diese C++ Methode zum Schreiben zu übergeben?

arpDestBuffers = Zeiger auf [create_string_buffer(7963648) for i in xrange(6)]

Danke für jede Hilfe.


Beide untenstehenden Antworten funktionieren. Ich habe einfach nicht bemerkt, dass ich ein weiteres Problem in meinem Code hatte, das mich daran gehindert hat, die Ergebnisse sofort zu sehen. Das erste Beispiel ist genau so, wie Luc geschrieben hat:

SixBuffers = c_char_p * 6
arpDestBuffers = SixBuffers(
            *[c_char_p(create_string_buffer(7963648).raw) for i in xrange(6)] )

Das zweite Beispiel, das von omu_negru's Antwort stammt, lautet:

arpDestBuffers = (POINTER(c_char) * 6)()
arpDestBuffers[:] = [create_string_buffer(7963648) for i in xrange(6)]

Beide werden von der Funktion akzeptiert und überschrieben. Wenn man print repr(arpDestBuffers[4][:10]) vor und nach dem Aufruf der Funktion eingibt, erhält man:

'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
'\x15\x10\x0e\xff\x15\x10\x0e\xff\x14\x0f'

was zeigt, dass die Funktion den Puffer erfolgreich mit Daten überschrieben hat.

1voto

luc Punkte 39730

Vielleicht etwas wie

SixBuffers = c_char_p * 6
arpDestBuffers = SixBuffers(*[c_char_p(create_string_buffer(7963648).raw) for i in xrange(6)])

Habe es selbst nicht ausprobiert, also nicht sicher, ob es funktioniert. Inspiriert von http://python.net/crew/theller/ctypes/tutorial.html#arrays

0voto

omu_negru Punkte 4582

Nachdem Sie alle erforderlichen string_buffers erstellt haben, indem Sie create_string_buffer aufrufen, können Sie ein Array für sie erstellen mit:

var=(POINTER(c_char)*size)()  /* pointer_to_pointer */

Dann können Sie es füllen, indem Sie es über var[index] indizieren und schließlich Ihre Funktion einfach unter Verwendung dieses Arguments aufrufen.... Funktioniert gut für mich und ich habe es gerade auf einer Funktion mit der Signatur void test_fn(char*,char**,unsigned char); in C getestet

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X