2016-07-22 9 views
0

私はSWIGを使ってPythonでCライブラリを使用しようとしています。このCライブラリは関数の結果をどこでも引数で渡します。オンラインのSWIGマニュアルを使用して、私はPythonに渡された整数関数の結果を得ることに成功しましたが、文字列に対してこれを行う方法を考え出すのは苦労しています。SWIGのtypemapをCのchar *からpythonの文字列

これは私のコードの本質である:

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); 

だから、基本的に私の質問はどのようなタイプマップです* outstrのように見えるべきです。

ありがとうございます。

+2

本当に 'outstr =" aaa ";'を意味しましたか?私はあなたが 'strcpy(outstr、" aaa ");を意味すると思う。 –

+0

私はそれをしたと思います。 –

+0

特に 'outstr =" aaa ";'は、呼び出し側が渡す文字列を変更しません。 'outstr'パラメータは関数内のローカル変数として扱われるので、' outstr = "aaa";ローカルの 'outstr'は名前のない、初期化された' {'a'、 'a'、 'a'の4文字の配列を指します。 '\ 0'} '。 –

答えて

1

SWIGマニュアル9.3.4 String handling: cstring.iをご覧ください。これは、char *引数で使用するいくつかのタイプマップを提供します。おそらく

例えば、関数の宣言の前に、あなたはSWIGインタフェースファイルにしたい(上記のコメントで述べたように、あなたが実際にstrcpy(outstr, "aaa")を使用していると仮定します):

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

あなたの提案をありがとう。私はすでにマニュアルを見てかなりの時間を費やしていましたが、Cコーダーではないので、マニュアルを読むのが難しく、サンプルを一般化するのが容易ではありません。 –

0

これは、私はそれが動作するようになった方法です、 SWIG 2.0 manualの34.9.3節の例を変更してください:

%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

あなたの 'temp'は単なる' char'ですから、あなたの 'outstr'が1の' char'より長い場合、このコードはある時点でsegfaultになります。さもなければ、あなたのコードは基本的に '%cstring_bounded_output'の簡略版です。 – m7thon

関連する問題