2009/6/7 Taner Yildirim <[email protected]>
> Dear Gustavo,
>
>
>
> Thanks for your detailed response. I hope pybindgen soon will have the full
> support for the stl-containers!
>
> I am looking forward to that particular version! Hopefully in the near
> future, I will learn more about pybindgen and maybe contribute something to
> the development of the project. It’s a great tool which has a much better
> and clean approach than swig and boos.python in my view!!!
>
>
>
> Back to my toy VecI example, unfortunately I am still having problem in
> getting the “add_function_as_contructor” work.
>
> Here is exactly what I am trying to do. In my earlier VecI class example, I
> had this function in tst1.h:
>
>
>
> void build_from_list( VecI &new_vec, std::vector<int> vi) {
>
> new_vec.clear(); new_vec=VecI(vi);}
>
>
>
> In c++ side, VecI is just a typedef for std::vector<int>. Hence this
> function works. For python side, pybindgen thinks that pybindgen container
> (i.e. std::Vector<int>) and my VecI class are two different things. Hence
> this function works as a bridge between them.
>
> Anyway, when I add this function as method with custom_name=FromList, I was
> able to build my vector from the python list:
>
>
>
> V=VecI()
>
> V=V.FromList(range(10))
>
>
>
> Now, I want to add this function as contructor rather than method so that I
> can simple say myvector=VecI(range(10)), let say!
>
> In, pybindgen CppFunctionAsConstructor, it says that the first parameter
> should return “a pointer to the class” (not the class itself!).
>
> Hence, I changed my code like this:
>
>
>
> VecI *from_list( std::vector<int> vi){
>
> VecI * p_new_vec=&vi;
>
> return p_new_vec;}
>
>
>
> Then, I add this to pybindgen as
>
>
>
>
> veci.add_function_as_constructor('from_list',ReturnValue.new('VecI*',caller_owns_return=True),
>
> [Parameter.new('std::vector<int>',' vec_int')])
>
>
>
> Of course, technically, everything seemed work! But the problem is that
> when I construct my vector, I am getting pointer and not the vector itself!
>
> What I mean is the following:
>
>
>
> V=VecI(range(10)) # works, python does not complain it!
>
>
>
> But then V.size() returns a huge integer. I think V is now a pointer and
> not the vector.
>
> Probably the fix is very simple but I just do not see it! I tried to use &
> instead of **, *
>
> but then compiler complain that it can not convert int to int*.
>
>
>
> Hope my problem is clear now.
>
Well, it is clear to me that you do not have deep knowledge of C/C++ memory
management, no offense intended :-)
Let's look at your code:
VecI *from_list( std::vector<int> vi){
VecI * p_new_vec=&vi;
return p_new_vec;
}
The variable p_new_vec will be a pointer that points to the 'vi' variable.
'vi' is a parameter passed by value, which means it is an "automatic
variable". When the function exits, 'vi' goes out of scope and is deleted.
However, you will have returned a pointer to what used to be a variable but
does not exist anymore; it points to garbage now.
The simplest solution is to copy the passed-in value, using a copy
constructor. I would do a code like this insterad:
VecI *from_list( std::vector<int> const &vi){
VecI * p_new_vec= new std::vector<int> (vi);
return p_new_vec;
}
This should work better. Good luck.
--
Gustavo J. A. M. Carneiro
INESC Porto, Telecommunications and Multimedia Unit
"The universe is always one step beyond logic." -- Frank Herbert
_______________________________________________
Cplusplus-sig mailing list
[email protected]
http://mail.python.org/mailman/listinfo/cplusplus-sig