Вопрос по python-3.x, multidimensional-array, python, ctypes, structure – Python, ctypes, многомерный массив

3

У меня есть структура в коде Python и в коде C. Я заполняю эти поля

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

в коде Python с правильными значениями, но когда я запрашиваю их в коде C, я получаю только 0,0 из всех ячеек массива. Почему я теряю ценности? Все остальные поля моих структур работают нормально.

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;
Итак, я должен просто отправить (c_float * (4 * 30))? shestakoffvs
Нет, это не работает, я получаю только 0,0. Кроме того, я попытался использовать (c_float * (4 * 30) и получить тот же результат (((я хочу плакать, потому что он не работает shestakoffvs
Многомерные массивы не отображаются один в один в памяти в c. Таким образом, float [30] [4] на самом деле является массивом (размер = 30) указателей с плавающей точкой (указывающих на начало массива с плавающей точкой). (C_float * 4) * 30) может быть массивом массивов (первые 4 числа с плавающей точкой, затем вторые 4 числа с плавающей точкой и т. Д.). Вы должны проверить это. Sebastian Hoffmann
и я хочу отправить значения в коде C shestakoffvs
нет, я думаю, что это должен быть указатель (c_float) * 30; использование[i] чтобы получить доступ к отдельным значениям тогда. напримерpbase = bones_pos_vect[17]; p = pbase[3] #third float in array; value = p.contents Sebastian Hoffmann

Ваш Ответ

1   ответ
11

как вы можете использовать многомерный массив с Python и ctypes.

Я написал следующий код C и использовалgcc в MinGW, чтобы скомпилировать этоslib.dll:

#include <stdio.h>

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");
    }
}

Следует отметить, что структура содержит «двумерный»; массив.

Затем я написал следующий скрипт на 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))

Когда я запустил скрипт Python, он вызвал функцию C, которая распечатывала содержимое многомерного массива:

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

Я использовал Python 2, в то время как теги в вашем вопросе указывают, что вы используете Python 3. Однако я не верю, что это должно иметь значение.

Ах, бей меня к этому. Я написал в основном один и тот же код со структурой и определением OP.
О, ребята, я такой глупый))) И большое спасибо, например, за код, с которым я понимаю, что не так с моим)))) Инстинкт присваивания каждому изменяющемуся массиву полей структуры, я просто назначил ему целый новый массив: scene_object.bones_pos_vects = import_content [& quot; bones_pos_vects & quot;] теперь я делаю это так: для n в диапазоне (len (import_content [& quot; bones_pos_vects & quot;])): для u в диапазоне (3): scene_object.bones_pos_vects [n] u ] = import_content [& quot; bones_pos_vects & quot;] [n] [u] scene_object.bones_rot_quats [n] [u] = import_content [& quot; bones_rot_quats & quot;] [n] [u] Теперь все работают очень хорошо))) большое спасибо)) ) shestakoffvs

Похожие вопросы