Я пытаюсь передать данные по слоям numpy и boost::ublas. Я написал ультратонкую оболочку, потому что swig не может правильно разобрать заголовок ublas. Код показан ниже
#include <boost/numeric/ublas/vector.hpp>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/lexical_cast.hpp>
#include <algorithm>
#include <sstream>
#include <string>
using std::copy;
using namespace boost;
typedef boost::numeric::ublas::matrix<double> dm;
typedef boost::numeric::ublas::vector<double> dv;
class dvector : public dv{
public:
dvector(const int rhs):dv(rhs){;};
dvector();
dvector(const int size, double* ptr):dv(size){
copy(ptr, ptr+sizeof(double)*size, &(dv::data()[0]));
}
~dvector(){}
};
с интерфейсом SWIG, который выглядит примерно так
%apply(int DIM1, double* INPLACE_ARRAY1) {(const int size, double* ptr)}
class dvector{
public:
dvector(const int rhs);
dvector();
dvector(const int size, double* ptr);
%newobject toString;
char* toString();
~dvector();
};
Я успешно скомпилировал их с помощью gcc 4.3 и vc++ 9.0. Однако, когда я просто бегу
a = dvector(array([1.,2.,3.]))
это дает мне segfault. Это первый раз, когда я использую swigh с numpy и не совсем понимаю между преобразованием данных и передачей буфера памяти. Кто-нибудь видит что-то очевидное, что я пропустил? Я попытался проследить с помощью отладчика, но он разбился в сборках python.exe. Я понятия не имею, проблема ли это в глотке или в моей простой обертке. Все ценится.