[Tutor] can I pass a "structure" to a C function to init a C struct?
Edward Tsang
ed_tsang@yahoo.com
Thu, 16 Sep 1999 22:01:13 -0700 (PDT)
Hello,
I have tried on the code I encountered segmentation fault error when it
at the
if(PyString_size(string_from_python) != sizeof(struct b_struct)
statement.
Can anyone give a hand?
--- "Michael P. Reilly" <arcege@shore.net> wrote:
> > A new question:
> > I'm trying this:
> > 1) create something similar to C structure with a
> number of fields say
> > 3 fields: a, b, c.
> > a will hold integer value
> > b will hold a string
> > c will hold a float
> > 2) Python script will pass this to a C function
> called
> > initStruct through a wrapper function.
> > 3)initStruct will initalise its a global structure
> according to a,b,and
> > c. its global structure also contains three
> fields: i,j,k. i being an
> > integer, j a string,, c a float. But they are C
> type.
> > 4) it will return the values to python script
> > 5) python script will know how to convert it back
> and display on screen
> >
> > Can anyone tell me what is teh best way to do
> that? Is that possible???
>
> You will want to look at the "struct" module which
> encodes data as a
> byte array (which is how a C struct is laid out in
> memory).
>
> Since you don't say what the integer is, I'll assume
> it is a long. Also
> you do not specify what the "string" is; is it a
> character array or a
> pointer to a char? Let's say that it is a character
> array.
>
> >>> import struct
> >>> fmt = "l20sf"
> >>> data = struct.pack(fmt, a, b, c)
> >>> print data
> '\377\000\000\000knights who say
> ni\000\000\320\017I@'
> >>> print struct.unpack(fmt, data)
> (255, 'knights who say ni\000\000', 3.14159011841)
>
> Then in the C function, overlay the resulting string
> as a pointer to
> the struct you want. When converting the data back,
> you need to deal
> with the null characters ('\000') in the unpacked
> string.
>
> struct b_struct {
> int a;
> char b[20];
> float c;
> } *b;
> PyObject *string_from_python;
> if (PyString_Size(string_from_python) !=
> sizeof(struct b_struct)) {
> PyErr_SetString(PyExc_AssertionError, "Given
> string not a good size");
> return NULL;
> }
> b = (struct b_struct
> *)PyString_AsString(string_from_python);
> printf("%d\n%s\n%f\n", b->a, b->b, b-c);
>
> Pointers will be more difficult since references are
> always
> dereferenced in Python. To handle pointers, you
> will need to write a C
> function.
>
> -Arcege
>
> --
>
------------------------------------------------------------------------
> | Michael P. Reilly, Release Engineer | Email:
> arcege@shore.net |
> | Salem, Mass. USA 01970 |
> |
>
------------------------------------------------------------------------
>
__________________________________________________
Do You Yahoo!?
Bid and sell for free at http://auctions.yahoo.com