5

SWIG を使用して Python 用にラップしようとしている C++ クラスがあります。配列を入力として受け取る関数の 1 つをラップしようとすると問題が発生します。

これがヘッダーファイルです。

class dyndiff_data_t
    {
    private:    

        double H[3];
        double GAMMA;
        double k;
        double P;
    public:
        dyndiff_data_t(double H_[3],
                        const double GAMMA_,
                        const double k_,
                        const double P_);

        void test();
    };

これがswigインターフェースファイルです

%module twowave
%{
  #define SWIG_FILE_WITH_INIT
  #include <twowave.h>
%}

%include "numpy.i"
%init %{
import_array();
%}

%apply (double IN_ARRAY1[3]) {(double H_[3])};

%include <twowave.h>

問題は、配列入力の場合、SWIG が typemap がないと文句を言うことです。理由がわかりません。numpy.i ファイルはhereから取得され、使用している typemap はhereで説明されています

どんな助けでも大歓迎です。

4

2 に答える 2

3

問題は、numpy.iのタイプマップが2つの引数のタイプマップを定義していて、それを1つの引数に適用しようとしていることです。これは、関数にintlen1とdouble*vec1のパラメーターがある場合に機能します。

%apply (int DIM1, double* IN_ARRAY1) {(int len, double* H_)}

独自のタイプマップを作成するのではなく、carrays.iを使用してください。

タイプマップを作成する場合、たとえば、doubleのタプルを入力として受け取る場合、次のようになります。

%typemap(in) double TUPLE[ANY]
{
   ...
}

その場合、あなたはそれをあなたが期待する方法であなたの関数に適用するでしょう。

%apply double TUPLE[3] {double H_[3]}

-tmsearchタイプマップを使用できない理由を理解しようとするときに開始するのに適した場所は、オプションを指定してSWIGを実行することです。関数パラメーターを一致させようとすると、何を探しているのかがわかります。

于 2013-02-08T10:22:53.877 に答える