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 {lvalue}, float*)
/*************************v_array def in stack.h:****************/
#ifndef _STACK_H
#define _STACK_H
#include
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
#include
// 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 >("array_floatstar", init< >())
.def(init< const v_array& >())
.def_readwrite("index", &v_array::index)
.def_readwrite("length", &v_array::length)
.def_readwrite("elements", &v_array::elements)
.def("last", &v_array::last, return_value_policy<
return_opaque_pointer >())
.def("decr", &v_array::decr)
.def("push", &v_array::push)
.def("alloc", &v_array::alloc)
.def("pop", &v_array::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