2016-07-22 5 views
0

Ich versuche, eine C-Bibliothek in Python mit SWIG zu verwenden. Diese C-Bibliothek übergibt Funktionsergebnisse durch Argumente überall. Mit dem Online-SWIG-Handbuch ist es mir gelungen, ein Integer-Funktionsergebnis an Python zu übergeben, aber es fällt mir schwer, herauszufinden, wie man das für eine Zeichenkette macht. SWIG Typmap von C char * zu Python String

Dies ist die Essenz meines Codes:

myfunc.c:

#include <myfunc.h> 

#include <stdio.h> 


int mystr(int inp, char *outstr){ 
    outstr="aaa"; 
    printf("%s\n", outstr); 
    return(0); 
} 

myfunc.h:

extern int mystr(int inp, char *outstr); 

Also im Grunde meine Frage ist, was die typemap für * outstr sollte aussehen.

Vielen Dank im Voraus.

+2

meinst du wirklich 'outStr = "aaa";'? Ich vermute, du meintest "strcpy (outstr, aaa"); '. –

+0

Ich denke, dass ich es tat. –

+0

Insbesondere 'outstr = "aaa"; 'würde die Zeichenfolge, die der Aufrufer übergibt, nicht ändern. Der Parameter' outstr 'wird in der Funktion als lokale Variable behandelt, also' outstr =" aaa "; local 'outstr' zeigt auf ein unbenanntes, initialisiertes Array von 4 Zeichen '{'a', 'a', 'a'. '\ 0'} '. –

Antwort

1

Schauen Sie sich das SWIG-Handbuch 9.3.4 String handling: cstring.i an. Dies bietet mehrere Typmaps für die Verwendung mit char * Argumente.

Wahrscheinlich (vorausgesetzt, Sie tatsächlich strcpy(outstr, "aaa") verwenden wie in einem Kommentar oben erwähnt) Sie in Ihrer SWIG Interface-Datei wollen, vor der Funktionsdeklaration, zB:

%include <cstring.i> 
%cstring_bounded_output(char* outstr, 1024); 
+0

Danke für Ihren Vorschlag. Ich habe schon einige Zeit damit verbracht, das Handbuch zu lesen, aber da ich kein C-Kodierer bin, finde ich das Handbuch schwierig zu lesen und die Beispiele sind nicht einfach zu verallgemeinern. –

0

Dies ist, wie ich es bekommen hätte, zu arbeiten, durch das Beispiel in Abschnitt 34.9.3 Modifizieren der SWIG 2.0 manual:

%typemap(in, numinputs=0) char *outstr (char temp) { 
    $1 = &temp; 
} 
%typemap(argout) char *outstr { 

    PyObject *o, *o2, *o3; 
    o = PyString_FromString($1); 
    if ((!$result) || ($result == Py_None)) { 
     $result = o; 
    } else { 
     if (!PyTuple_Check($result)) { 
      PyObject *o2 = $result; 
      $result = PyTuple_New(1); 
      PyTuple_SetItem($result,0,o2); 
     } 
     o3 = PyTuple_New(1); 
     PyTuple_SetItem(o3,0,o); 
     o2 = $result; 
     $result = PySequence_Concat(o2,o3); 
     Py_DECREF(o2); 
     Py_DECREF(o3); 
    } 
} 
+0

Ihr 'temp' ist nur ein einzelnes' char', also wird dieser Code irgendwann segfault, wenn Ihr 'outstr' länger als 1 'char' ist. Andernfalls ist Ihr Code im Wesentlichen eine vereinfachte Version von '% cstring_bounded_output'. – m7thon