Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > How to access an Array and a struct within a struct wrapped by Swig ?

Reply
Thread Tools

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

 
 
emmanuel.rivoire@gmail.com
Guest
Posts: n/a
 
      08-16-2008
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 ..?
 
Reply With Quote
 
 
 
 
emmanuel.rivoire@gmail.com
Guest
Posts: n/a
 
      08-16-2008
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..!
 
Reply With Quote
 
 
 
 
Anish Chapagain
Guest
Posts: n/a
 
      08-16-2008
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
>>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,
>>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, (E-Mail Removed) wrote:
> 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 ..?


---------------
 
Reply With Quote
 
emmanuel.rivoire@gmail.com
Guest
Posts: n/a
 
      08-18-2008
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
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: How include a large array? Edward A. Falk C Programming 1 04-04-2013 08:07 PM
ruby callback for a SWIG wrapped C function Lyes Amazouz Ruby 2 08-20-2008 01:11 PM
a manipulator wrapped inside a struct/class does not compile stoptv@gmail.com C++ 8 10-30-2005 02:22 PM
length of an array in a struct in an array of structs in a struct in an array of structs Tuan Bui Perl Misc 14 07-29-2005 02:39 PM
Cloning SWIG wrapped C++ classes Gennady Bystritksy Ruby 0 04-28-2005 11:03 PM



Advertisments