2

いくつかの 2D 配列メンバー変数を持つ C++ クラスを Python スクリプトに渡そうとしています。2D 配列は、コンストラクターとは関係なく、クラスに直接割り当てられます。私はこの変換にboost_pythonライブラリを使用しています.add_property/reference_existing_object関数を使用するラッパー関数は、C++スクリプトのダブルポインタから新しいPython 2D配列を作成することを期待しています.

ただし、配列を処理するときに、boost が const double から double に変換できないというエラーが表示されます。しかし、そもそも配列を const に設定するべきではありませんか? 私はここにいる可能性があります。私はブーストが初めてで、C++ を書いてからしばらく経っているので、これを簡単な方法で説明してくれる人がいるといいのですが:)私のアプローチがうまくいかない場合、どうすればこれらの配列を渡すことができますか?

参照用にクラスとラッパー関数をここに投稿しています。

class Interface 
{
public:

   double zUpPatch1[NVALUES_UPSWEEP][N_VALUES_IN_TUPLE+1];
   double zUpPatch2[NVALUES_UPSWEEP][N_VALUES_IN_TUPLE+1];
   double zDownPatch1[NVALUES_UPSWEEP][N_VALUES_IN_TUPLE+1];
   double zDownPatch2[NVALUES_UPSWEEP][N_VALUES_IN_TUPLE+1];

   bool bNewData[N_VALUES_IN_TUPLE+1];
   int mrows, ncols;

   Interface();
   void GetRawData(int);
};

Interface::Interface()
{
   mrows = NVALUES_UPSWEEP;
   ncols = N_VALUES_IN_TUPLE+1;
}

BOOST_PYTHON_MODULE(GetRawDataPy_ext)
{
   using namespace boost::python;

   class_<Interface>("Interface", init<>())
     .def("GetRawData", &Interface::GetRawData)
     .def_readwrite("mrows", &Interface::mrows)
     .def_readwrite("ncols", &Interface::ncols)
     .def_readwrite("bNewData", &Interface::bNewData)

     .add_property("zUpPatch1",
     make_getter(&Interface::zUpPatch1, return_value_policy<reference_existing_object>()),
     make_setter(&Interface::zUpPatch1, return_value_policy<reference_existing_object>()))

     .add_property("zUpPatch2",
     make_getter(&Interface::zUpPatch2, return_value_policy<reference_existing_object>()),
     make_setter(&Interface::zUpPatch2, return_value_policy<reference_existing_object>()))

     .add_property("zDownPatch1",
     make_getter(&Interface::zDownPatch2, return_value_policy<reference_existing_object>()),
     make_setter(&Interface::zDownPatch2, return_value_policy<reference_existing_object>()))

     .add_property("zDownPatch2",
     make_getter(&Interface::zDownPatch2, return_value_policy<reference_existing_object>()),
     make_setter(&Interface::zDownPatch2, return_value_policy<reference_existing_object>()))

     .add_property("bNewData",
     make_getter(&Interface::bNewData, return_value_policy<reference_existing_object>()),
     make_setter(&Interface::bNewData, return_value_policy<reference_existing_object>()))
  ;
}

これは、ブースト コンパイラからのエラー メッセージの抜粋です。

C:\...\.../data_members.hpp(64) : error C2440: '=' : cannot convert from 
'const double [1000][5]' to double [1000][5]'
          There is no context in wich this conversion is possible
C:\...\.../data_members.hpp(63) : while compiling class template member function 
'void boost::python::detail::member<Data,Class>::operator ()(Class &,const double (&))   const'
    with
    [
        Data=double [1000][5],
        Class=Class
    ]

前もって感謝します!

4

0 に答える 0