Converting from Python integer to C++ by reference
Hello, I am attempting to expose a class in C++ with a method that takes a reference to an integer. Thus, a simple version of what I have is as follows: class C { public: void SetMe(int& i); } and SetMe is implemented as follows: void C::SetMe(int& i) { i = 5; } and my goal is to be able to call this method from Python with an integer and have the value of that integer in Python set. Thus, in Python, I would like to do: c = C() i = 0 c.SetMe(i) and have i's value be 5. However, when I do this, I get an exception on line 292 of arg_from_python.hpp (at the end of the constructor for reference_arg_from_python) that simply says I have an access violation. If I get rid of the reference and made SetMe simply declared as "void SetMe(int i)", the code works fine. Also, if I change int to long (as I believe Python integers are actually C++ long types), but keep the reference (thus, having void SetMe(long& i), it gives me the same error. It seems like I am doing something fundamentally wrong. How should I fix this problem? Thanks, Saikat Chakrabarti
On 8/18/05, Saikat Chakrabarti <smartel@real.com> wrote:
Hello, I am attempting to expose a class in C++ with a method that takes a reference to an integer. Thus, a simple version of what I have is as follows:
class C { public: void SetMe(int& i); }
and SetMe is implemented as follows:
void C::SetMe(int& i) { i = 5; }
and my goal is to be able to call this method from Python with an integer and have the value of that integer in Python set. Thus, in Python, I would like to do:
c = C() i = 0 c.SetMe(i)
and have i's value be 5. However, when I do this, I get an exception on line 292 of arg_from_python.hpp (at the end of the constructor for reference_arg_from_python) that simply says I have an access violation. If I get rid of the reference and made SetMe simply declared as "void SetMe(int i)", the code works fine. Also, if I change int to long (as I believe Python integers are actually C++ long types), but keep the reference (thus, having void SetMe(long& i), it gives me the same error. It seems like I am doing something fundamentally wrong. How should I fix this problem?
I believe that the fundamental problem here is that because integers are not mutable objects in Python, there's no concept of a "reference to an int" as far as Python is concerned. For example, if you were to attempt to write your example in Python, you'd get the same behavior:
class C: ... def SetMe(self,i): ... i = 5 ... c = C() i = 0 c.SetMe(i) i 0
One way to simulate modifying the integer would be to return the result, something like:
class C: ... def SetMe(self,i): ... i = 5 ... return i ... c = C() i = 0 i=c.SetMe(i) i 5
-greg
participants (2)
-
Greg Landrum -
Saikat Chakrabarti