Multi-dimensionales char-array (array von strings) in python-ctypes
Ich versuche, übergeben Sie ein array von Zeichen-arrays zu einer C-Funktion mit ctypes.
void cfunction(char ** strings)
{
strings[1] = "bad"; //works not what I need.
strings[1][2] = 'd'; //this will segfault.
return;
}
char *input[] = {"foo","bar"};
cfunction(input);
Da das array, die ich um sich werfen ist statisch definiert, sowieso,
Ich habe gerade die Deklaration der Funktion und die Eingabeparameter wie zum Beispiel so:
void cfunction(char strings[2][4])
{
//strings[1] = "bad"; //not what I need.
strings[1][2] = 'd'; //what I need and now it works.
return;
}
char input[2][4] = {"foo","bar"};
cfunction(input);
Nun hatte ich das problem, wie zu definieren, diese multi-dimensionale Charakter
array in python. Ich hatte gedacht, es würde gehen, etwa so:
import os
from ctypes import *
libhello = cdll.LoadLibrary(os.getcwd() + '/libhello.so')
input = (c_char_p * 2)()
input[0] = create_string_buffer("foo")
input[1] = create_string_buffer("bar")
libhello.cfunction(input)
Das gibt mir TypeError: incompatible types, c_char_Array_4 instance instead of c_char_p instance
. Wenn ich es zu ändern:
for i in input:
i = create_string_buffer("foo")
Dann bekomme ich segmentation faults. Auch dieser sieht aus wie der falschen Art und Weise zu bauen, das 2d-array, denn wenn ich print input sehe ich None
:
print input[0]
print input[1]
# outputs None, None instead of "foo" and "foo"
Ich führe auch in der Frage der Verwendung von #DEFINE MY_ARRAY_X 2
und #DEFINE MY_ARRAY_Y 4
zum halten der array-Dimensionen direkt in meine C-Dateien, aber weiß nicht ein guter Weg, um diese Konstanten aus der libhello.also so, dass python verweisen können, wenn es Konstrukte, die die datatypes.
- irgendein feedback dazu?
- sieht gut aus; ich arbeitete Ihre Konstruktion in meinen code und es funktionierte! Die python-Dokumentation zur Verfügung gestellt, die create_string_buffer Helfer-Funktion, so dass ich denke, ich war einfach entschlossen, es zu benutzen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Etwas wie
Einfache Nutzung: