いくつかの 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
]
前もって感謝します!