
Dear all, I wraped a v_varray class into python by boost. I called it in python, most of its attributes work well. Only when I call a.push(1.0),it crashed due to not match type.The problem is that my input argument in c++ is float*(for passing an array) while python has no pointer type. How can I pass a variable in python to a.push() to make sure it work correctly? Many thanks for help! Javen /*************************running result in python:****************/
a.push(1.0) Traceback (most recent call last): File "<stdin>", line 1, in ? Boost.Python.ArgumentError: Python argument types in array_floatstar.push(array_floatstar, float) did not match C++ signature: push(v_array<float*> {lvalue}, float*)
/*************************v_array def in stack.h:****************/ #ifndef _STACK_H #define _STACK_H #include <stdlib.h> template<class T> class v_array{ public: int index; int length; T* elements; T last() { return elements[index-1];} void decr() { index--;} v_array() { index = 0; length=0; elements = NULL;} T& operator[](unsigned int i) { return elements[i]; } void push(const T &new_ele) { while(index >= length) { length = 2*length + 3; elements = (T *)realloc(elements,sizeof(T) * length); } this->elements[index++] = new_ele; } void alloc(int newLength) { elements = (T *)realloc(elements, sizeof(T) * newLength); length = newLength; } T pop() { if (index > 0) return this->elements[--index]; else return T(); } }; #endif /*************************stack.cpp for boost.python(bjam need it to build a stack.so file):****************/ // Boost Includes ============================================================== #include <boost/python.hpp> #include <boost/cstdint.hpp> // Includes ==================================================================== #include "stack.h" // Using ======================================================================= using namespace boost::python; // Declarations ================================================================ BOOST_PYTHON_OPAQUE_SPECIALIZED_TYPE_ID(float) // Module ====================================================================== BOOST_PYTHON_MODULE(stack) { class_< v_array<float*> >("array_floatstar", init< >()) .def(init< const v_array<float*>& >()) .def_readwrite("index", &v_array<float*>::index) .def_readwrite("length", &v_array<float*>::length) .def_readwrite("elements", &v_array<float*>::elements) .def("last", &v_array<float*>::last, return_value_policy< return_opaque_pointer >()) .def("decr", &v_array<float*>::decr) .def("push", &v_array<float*>::push) .def("alloc", &v_array<float*>::alloc) .def("pop", &v_array<float*>::pop, return_value_policy< return_opaque_pointer >()) ; } -- Qinfeng(Javen) Shi Research School of Information Sciences and Engineering Australian National University Locked Bag 8001 Canberra ACT 2601