Connecting Tech Pros Worldwide Help | Site Map

How to access an Array and a struct within a struct wrapped by Swig ?

emmanuel.rivoire@gmail.com
Guest
 
Posts: n/a
#1: Aug 16 '08
Hello,

I spent almost a week to be able to embed Python within my C++ game
engine.
I wrote a mini-tutorial of what I was able to do so far here :
http://forums.indiegamer.com/showpos...52&postcount=9

At the end of my tutorial, I wrote : "You can do the same with C++
classes, and with structures within structures. Swig can parse & wrap
most C/C++ declarations."

Gloups, I was so wrong..! :-S

It seems that I can read a struct within my struct, but I cannot write
values to it.
Also, I cannot access the array from within my struct.

Any help to achieve this would be very welcome.

Here the problem in detail :
I'm using Python 2.5.2 & Swig 1.3.36.

The structures :
struct SIn
{
int in1, in2;
};

struct SPythoned
{
SIn Inner;
float Skill[16];
};

The python code :
=======================
def TestObject(o):
print(type(o))
print(type(o.Skill))
print(o.Skill)
print(type(o.Inner))
print(type(o.Inner.in1))
print(o.Inner.in1)
print(o.Inner.in2)

o.Inner.in1 = 12
o.Inner.in2 = 17

print(o.Inner.in1)
print(o.Inner.in2)
=======================


It gives me this output :
=======================
<class 'TE2008.SPythoned'>
<type 'PySwigObject'>
_20fd1300_p_float
<class 'TE2008.SIn'>
<type 'int'>
2
22
2
22
=======================

So althought I can read the value, the "o.Inner.inX = Y" are without
effect..! (and checking the value in the object in the C part confirms
this).

Moreover, if I add these lines :
for i in range(16) :
print(o.Skill[i])

I get this error :
Traceback (most recent call last):
File "d:\TE 2008\PyTest.py", line 32, in TestObject
print(o.Skill[i])
TypeError: 'PySwigObject' object is unsubscriptable

Any idea how to make this work ..?
emmanuel.rivoire@gmail.com
Guest
 
Posts: n/a
#2: Aug 16 '08

re: How to access an Array and a struct within a struct wrapped by Swig ?


Ok, Swig needs the structure to be declared like this :
typedef struct SIn
{
int in1, in2;
} SIn;

Else, it doesn't understand it's a structure... :-S
Now, I can write to it.

I also found out that Swig didn't allow to write to the array :
http://www.swig.org/Doc1.3/SWIG.html#SWIG_nn34 ... :-S
So I just have to find out how to read the array, and I'll be all
good..!
Anish Chapagain
Guest
 
Posts: n/a
#3: Aug 16 '08

re: How to access an Array and a struct within a struct wrapped by Swig ?


Hi,
If you have struct defined in .h file then it's ok or can dea easyily
with struct written with .i file,
in .h file,
struct def
{
int a;
char name[10];
};
can be referenced as
Quote:
Quote:
>>strvar=new_def() //now strvar is your
object for struct def
and can access a and name as, get and
set for individual member see,
Quote:
Quote:
>>def_a_set(strvar,10)
>>def_a_get(strvar) will return 10.
or you can define struct as,

typedef struct
{
int sage;
}coll;
within .h file and access similarly.

regard's
Anish Chapagain
www.mysticnepal.com

On Aug 16, 11:38*am, emmanuel.rivo...@gmail.com wrote:
Quote:
Hello,
>
I spent almost a week to be able to embed Python within my C++ game
engine.
I wrote a mini-tutorial of what I was able to do so far here :http://forums.indiegamer.com/showpos...52&postcount=9
>
At the end of my tutorial, I wrote : "You can do the same with C++
classes, and with structures within structures. Swig can parse & wrap
most C/C++ declarations."
>
Gloups, I was so wrong..! :-S
>
It seems that I can read a struct within my struct, but I cannot write
values to it.
Also, I cannot access the array from within my struct.
>
Any help to achieve this would be very welcome.
>
Here the problem in detail :
I'm using Python 2.5.2 & Swig 1.3.36.
>
The structures :
struct SIn
{
* * * * int in1, in2;
>
};
>
struct SPythoned
{
* * * * SIn Inner;
* * * * float Skill[16];
>
};
>
The python code :
=======================
def TestObject(o):
* * * * print(type(o))
* * * * print(type(o.Skill))
* * * * print(o.Skill)
* * * * print(type(o.Inner))
* * * * print(type(o.Inner.in1))
* * * * print(o.Inner.in1)
* * * * print(o.Inner.in2)
>
* * * * o.Inner.in1 = 12
* * * * o.Inner.in2 = 17
>
* * * * print(o.Inner.in1)
* * * * print(o.Inner.in2)
=======================
>
It gives me this output :
=======================
<class 'TE2008.SPythoned'>
<type 'PySwigObject'>
_20fd1300_p_float
<class 'TE2008.SIn'>
<type 'int'>
2
22
2
22
=======================
>
So althought I can read the value, the "o.Inner.inX = Y" are without
effect..! (and checking the value in the object in the C part confirms
this).
>
Moreover, if I add these lines :
* * * * for i in range(16) :
* * * * * * * * print(o.Skill[i])
>
I get this error :
Traceback (most recent call last):
* File "d:\TE 2008\PyTest.py", line 32, in TestObject
* * print(o.Skill[i])
TypeError: 'PySwigObject' object is unsubscriptable
>
Any idea how to make this work ..?
---------------
emmanuel.rivoire@gmail.com
Guest
 
Posts: n/a
#4: Aug 18 '08

re: How to access an Array and a struct within a struct wrapped by Swig ?


Anish Chapagain, I already know how to use structure, as my example
shown it.
I had trouble only with the nested structures, and it was coz of
missing typedef (ie: Swig need C struct declaration, not C++).

And I still cannot find how to get my arrays... :-S
jparker104@gmail.com
Guest
 
Posts: n/a
#5: Aug 19 '08

re: How to access an Array and a struct within a struct wrapped by Swig ?


On Aug 17, 11:30*pm, emmanuel.rivo...@gmail.com wrote:
Quote:
Anish Chapagain, I already know how to use structure, as my example
shown it.
I had trouble only with the nested structures, and it was coz of
missing typedef (ie: Swig need C struct declaration, not C++).
>
And I still cannot find how to get my arrays... :-S
I was having the same problem with arrays and found a workaround here:
http://www.swig.org/papers/PyTutoria...Tutorial97.pdf
slide 39, "Helper Functions" I got it to work, hope this helps
emmanuel.rivoire@gmail.com
Guest
 
Posts: n/a
#6: Aug 21 '08

re: How to access an Array and a struct within a struct wrapped by Swig ?


Thanks to point this out.
It confirmed that I thought : must _manually_ write set/get functions
for every array in a every structure (it looks like middle-age ;) ).
Coz of this and a few other stuff, while looking at my code, I came to
the conclusion that I will be better writing interface C structs
between my code & the Python modules. It's really not the most
convenient way as any change to my initial structs will have to be
forwarded the interface structs. But hopefully it won't be too much
work, as my engine is already quite mature, and thus, shouldn't see
many changes anymore...
Closed Thread