7

SWIG for Python を使用してラップされた C 関数から値の配列を出力しようとしています。私がやろうとしている方法は、次のタイプマップを使用することです。

擬似コード:

int oldmain() {
float *output = {0,1};
return output;
}

タイプマップ:

%typemap(out) float* { 
   int i; 
  $result = PyList_New($1_dim0); 
   for (i = 0; i < $1_dim0; i++) { 
 PyObject *o = PyFloat_FromDouble((double) $1[i]); 
 PyList_SetItem($result,i,o); 
 } 
} 

コードは正常にコンパイルされますが、この関数へのアクセスを実行するとハングします (これ以上デバッグする方法はありません)。

私が間違っている場所に関する提案はありますか?

ありがとう。

4

2 に答える 2

7

長さを変化させる最も簡単な方法は、配列のサイズも示す別の出力パラメーターを追加することです。

%module test

%include <stdint.i>

%typemap(in,numinputs=0,noblock=1) size_t *len  {
  size_t templen;
  $1 = &templen;
}

%typemap(out) float* oldmain {
  int i;
  $result = PyList_New(templen);
  for (i = 0; i < templen; i++) {
    PyObject *o = PyFloat_FromDouble((double)$1[i]);
    PyList_SetItem($result,i,o);
  }
}

%inline %{
float *oldmain(size_t *len) {
  static float output[] = {0.f, 1.f, 2, 3, 4};
  *len = sizeof output/sizeof *output;
  return output;
}
%}

これは、実行時に配列の長さを返すために使用できる追加するために、この回答から変更されています。size_t *lenただし、typemap はその出力を Python ラッパーから完全に隠し%typemap(out)、固定サイズの代わりにそれを使用して、返されるリストの長さを制御します。

于 2012-07-27T07:40:27.670 に答える
6

これでうまくいくはずです:

/* example.c */

float * oldmain() {
    static float output[] = {0.,1.};
    return output;
}

ここでポインタを返していますが、swig はそのサイズを認識していません。プレーンな $1_dim0 は機能しないため、ハードコーディングするか、他の魔法を実行する必要があります。このようなもの:

/* example.i */
%module example
%{
 /* Put header files here or function declarations like below */
  extern float * oldmain();
%}

%typemap(out) float* oldmain {
  int i;
  //$1, $1_dim0, $1_dim1
  $result = PyList_New(2);
  for (i = 0; i < 2; i++) {
    PyObject *o = PyFloat_FromDouble((double) $1[i]);
    PyList_SetItem($result,i,o);
  }
}

%include "example.c"

次に、Pythonで取得する必要があります:

>> import example
>> example.oldmain()
[0.0, 1.0]

-debug-tmsearchタイプマップを追加するとき、非常に便利 だと思うかもしれません。

swig -python -debug-tmsearch example.i

の適切な「出力」タイプマップを探すときに、タイプマップが使用されることを明確に示す必要がありますfloat *oldmain。また、単に c グローバル変数配列にアクセスしたい場合は、 typemap for のvarout代わりに同じトリックを実行できますout

于 2012-07-27T02:05:08.000 に答える