Python, ctypes, array multidimensional

Tengo estructura en código Python y en código C. Relleno estos campos

("bones_pos_vect",((c_float*4)*30)), ("bones_rot_quat",((c_float*4)*30)) 

en el código de Python con los valores correctos, pero cuando los solicito en el código C, solo obtengo 0.0 de todas las celdas de la matriz. ¿Por qué pierdo los valores? Todos los demás campos de mis estructuras funcionan bien.

 class SceneObject(Structure): _fields_ = [("x_coord", c_float), ("y_coord", c_float), ("z_coord", c_float), ("x_angle", c_float), ("y_angle", c_float), ("z_angle", c_float), ("indexes_count", c_int), ("vertices_buffer", c_uint), ("indexes_buffer", c_uint), ("texture_buffer", c_uint), ("bones_pos_vect",((c_float*4)*30)), ("bones_rot_quat",((c_float*4)*30))] typedef struct { float x_coord; float y_coord; float z_coord; float x_angle; float y_angle; float z_angle; int indexes_count; unsigned int vertices_buffer; unsigned int indexes_buffer; unsigned int texture_buffer; float bones_pos_vect[30][4]; float bones_rot_quat[30][4]; } SceneObject; 

Este es un ejemplo de cómo puede usar una matriz multidimensional con Python y ctypes.

Escribí el siguiente código C y usé gcc en MinGW para comstackr esto en slib.dll :

 #include  typedef struct TestStruct { int a; float array[30][4]; } TestStruct; extern void print_struct(TestStruct *ts) { int i,j; for (j = 0; j < 30; ++j) { for (i = 0; i < 4; ++i) { printf("%g ", ts->array[j][i]); } printf("\n"); } } 

Tenga en cuenta que la estructura contiene una matriz “bidimensional”.

Luego escribí el siguiente script de Python:

 from ctypes import * class TestStruct(Structure): _fields_ = [("a", c_int), ("array", (c_float * 4) * 30)] slib = CDLL("slib.dll") slib.print_struct.argtypes = [POINTER(TestStruct)] slib.print_struct.restype = None t = TestStruct() for i in range(30): for j in range(4): t.array[i][j] = i + 0.1*j slib.print_struct(byref(t)) 

Cuando ejecuté el script de Python, llamó a la función C, que imprimió los contenidos de la matriz multidimensional:

 C:\>slib.py 0.1 0.2 0.3 0.4 1.1 1.2 1.3 1.4 2.1 2.2 2.3 2.4 3.1 3.2 3.3 3.4 4.1 4.2 4.3 4.4 5.1 5.2 5.3 5.4 ... rest of output omitted 

He usado Python 2, mientras que las tags en tu pregunta indican que estás usando Python 3. Sin embargo, no creo que esto deba hacer una diferencia.