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.
InformationsquelleAutor user17925 | 2010-11-04
Schreibe einen Kommentar