Arrays dynamics y estructuras en estructuras en python.

Estoy intentando implementar estas estructuras de C en python usando ctypes:

struct _rows { int cols_count; char *cols[]; } struct _unit { int rows_count; struct _rows *rows; } int my_func(struct _unit *param); 

El problema es que _rows.cols es una matriz de tamaño dynamic de puntero de carácter y _unit.rows es una matriz de tamaño dynamic de estructura de _rows. ¿Cómo puedo implementar esto usando ctypes en python?

Pude definir una función que devolverá una estructura de _rows con un número variable de punteros de caracteres:

 def get_row(cols): class Row(ctypes.Structure): _fields_ = [("cols_count", ctypes.c_int), ("cols", ctypes.c_char_p * cols) ] 

No sé qué hacer, nex, todo está un poco confuso y la documentación de ctypes no está ayudando.

Estoy haciendo algunas suposiciones sobre lo que quiere el OP, y me encantarían las sugerencias si hay una forma más fácil de hacer esto, pero esto es lo que se me ocurrió:

demo.py

 import string from ctypes import Structure,c_int,c_char_p,POINTER,cast,pointer,byref,CDLL class Row(Structure): _fields_ = [('cols_count', c_int), ('cols', POINTER(c_char_p))] def __init__(self,cols): self.cols_count = cols # Allocate an array of character pointers pc = (c_char_p * cols)() self.cols = cast(pc,POINTER(c_char_p)) class Unit(Structure): _fields_ = [('rows_count', c_int), ('rows',POINTER(Row))] def __init__(self,rows,cols): self.rows_count = rows # Allocate an array of Row structures. # This does NOT call __init__. pr = (Row * rows)() # Call init manually with the column size. for r in pr: r.__init__(cols) self.rows = cast(pr,POINTER(Row)) unit = Unit(2,3) # Stuff some strings ('aaaaa','bbbbb',etc.) for i in xrange(unit.rows_count): for j in xrange(unit.rows[i].cols_count): unit.rows[i].cols[j] = string.ascii_lowercase[i*5+j]*5 dll = CDLL('test.dll') dll.my_func(byref(unit)) 

prueba.c

 #include  struct _rows { int cols_count; char **cols; }; struct _unit { int rows_count; struct _rows *rows; }; __declspec(dllexport) int my_func(struct _unit *param) { int i,j; for(i=0;irows_count;i++) for(j=0;jrows[i].cols_count;j++) printf("%d,%d = %s\n",i,j,param->rows[i].cols[j]); return 0; } 

makefile

Comstackdo con Visual Studio 2010.

 test.dll: test.c cl /W4 /LD test.c 

Salida

 0,0 = aaaaa 0,1 = bbbbb 0,2 = ccccc 1,0 = fffff 1,1 = ggggg 1,2 = hhhhh