Re: Accessing 2 dimensional array from SWIG in Python

guhan balasubramanian <[email protected]> Mon, 28 Aug 2023 10:13:43 -0700
Newsgroups gmane.comp.programming.swig
Message-ID <CAMNAJg2Sd1x1k1c8fEq6U-ushVyjNhi9uRk4sWRQszOfypBZEg@mail.gmail.com>
Please pardon the typo,
The variable name for 2-dimensional structure should be myStruct [][]
instead of myData [][] based on the example.

On Mon, Aug 28, 2023 at 10:11 AM guhan balasubramanian <[email protected]>
wrote:

> Hi,
>
> I'm working on a SWIG layer to convert a C interface to Python.
>
> *Problem:*
> I have the following structure in C that I need to expose in Python:
>
> C Code (example module):
> // ==========================
> typedef struct _myStruct {
>   int x;
>   int y;
> } myStruct;
>
> typedef struct _myData {
>   int a[10][10];
>   myStruct myS[10][10];
> } myData;
> // ==========================
>
> With no special changes in the interface file, I'm able to receive a
> populated myData variable. The problem I have is accessing it through
> Python.
>
> Python Code:
> ############################
> import example as e
> md = e.myData()
> e.fill_data(md)
>
> # The data for the 2 dimensional member variables are not subscriptable
> nor iterable.
> # md.a is of type "Swig object of type int (*)[10]"
> # md.myS is of type "Swig object of type myStruct (*)[10]"
> #############################
>
> Could you please help with the pointers/existing-literature to access
> these 2-dimensional arrays? It would be a bonus if I could access the value
> in the array as the same data type as in C. I am trying to avoid external
> libraries like numpy or ctypes as much as possible.
>
> *What I've tried so far:*
> *Attempt 1: *
> A typemap(out) for int [ROW_SIZE][COL_SIZE] or myStruct
> [ROW_SIZE][COL_SIZE].
> There are two issues with this typemap:
> - I need to pattern match with hardcoded ROW_SIZE/COL_SIZE since if I pass
> ANY, it is hard to convert the data to a Python friendly format.
> - The Python friendly format used was PyList [][] with PyLong elements as
> values for int. So it should be straightforward for primitive data types.
> - This solution gets complicated for custom structures like myStruct.
>
> *Attempt 2:*
> Tried in built functions in the interface file provided by SWIG, but this
> is not able to convert the input type (Swig Object) to the corresponding
> type defined by the array_functions.
>
> %array_functions( int, intArray );
> %pointer_class(int, intp);
> %array_functions( intp, intpArray );
> %pointer_functions(int, intpf);
>
>
> Thanks,
> Guhan
>
>

_______________________________________________
Swig-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/swig-user