Привести массив указателей на другие объекты?

Я пытаюсь отправить массив объектов в мою библиотеку c.

Объект, который я пытаюсь отправить, — это тело пимуна. В него встроен объект-указатель. Body._body, Я смог передать один из них своей функции и извлечь из функций Бурундука все, что хотел. я использовал cpBodyGetMass просто как тест, и это сработало.

Если я сделаю массив из них. Единственное, что работает, это первое.

Я хочу иметь возможность отправить Body._body обращается как массив к моей DLL. Я подумал, что могу сохранить указатель в c_int или же c_long массив и преобразовать эти адреса в cpBody что бурундук хочет.

Вот моя пользовательская функция

int pymunk_body(int color_id, int numof, float * values, cpBody * body){

glBindTexture(GL_TEXTURE_2D,0);
cpBody bd;
float red;
float green;
float blue;
float alpha;
float sizex;
float sizey;
cpVect position;
float positionx;
float positiony;
float rotation;

for (int i=0;i<numof*6;i=i+6){
bd=body[i/6];
red=values[0+i];
green=values[1+i];
blue=values[2+i];
alpha=values[3+i];
sizex=values[4+i];
sizey=values[5+i];
position=cpBodyGetPos(body);
positionx=position.x;
positiony=position.y;
rotation=cpBodyGetAngle(body)*180/PI;
}

В моем C ++ нет переноса через Python, поэтому я могу отправлять только объекты C. То, как я это делал, это …

    gldll[4](ctypes.c_int(add_color),
ctypes.c_float(color[0]),
ctypes.c_float(color[1]),
ctypes.c_float(color[2]),
ctypes.c_float(color[3]),
ctypes.c_float(position[0]),
ctypes.c_float(position[1]),
ctypes.c_float(rotation),
ctypes.c_float(size[0]),
ctypes.c_float(size[1]))

а также

    ni=numpy.array([self.texture.TextureID,ublur,add_color,blurSize,self.Blur+blur,textfont],"i")
nf=numpy.array([(self.width+self.height)/2.0,color[0],color[1],color[2],color[3],position[0],position[1],rotation,self.half_width,self.half_height,scale],"f")

gldll[2](ctypes.c_void_p(ni.ctypes.data),ctypes.c_void_p(nf.ctypes.data))

Теперь, если я отправлю массив указателей. В основном массив из 4 байтов. cpBody body[] Предполагается, что он должен прыгать, в байтах sizeof (cpBody) в массиве, чтобы добраться до следующего объекта. Но их не встраивают. Это список случайных указателей на все тела. Мне нужно, чтобы прочитать адрес в каждом элементе массива и предположить, что есть cpBody в этом месте.

Если вы посмотрите на второй пример. Я отправил массив с помощью одного указателя. Мне нужно отправить указатель на массив указателей и получить cpBody от каждого. Это означает, что мне нужен массив для перехода только на 4 байта и чтения адреса памяти как cpBody,

1

Решение

Это краткий пример того, как отправить массив объектов pymunk.Body в библиотеку c:

Сначала код c:

#include "chipmunk.h"
double mass_sum(size_t numof, cpBody ** body);
double mass_sum(size_t numof, cpBody ** body){
double total = 0;
for (int i=0; i<numof; i++){
total += cpBodyGetMass(body[i]);
}
return total;
}

Тогда код Python:

from ctypes import *
import sys
sys.path.insert(0,'..')

import pymunk

sendbody_lib = windll.LoadLibrary("sendbody.dll")

cpBody = pymunk._chipmunk.cpBody

mass_sum = sendbody_lib.mass_sum
mass_sum.restype = c_double
mass_sum.argtypes = [c_int, POINTER(POINTER(cpBody))]

b1 = pymunk.Body(1, 1)
b2 = pymunk.Body(10, 1)
bodies = [b1._body, b2._body, b1._body]
arr = (POINTER(cpBody) * len(bodies))(*bodies)

print mass_sum(len(arr), arr)

(Мне пришлось изменить путь, чтобы мой код нашел pymunk, как вы можете видеть в начале, но это только потому, что по умолчанию он не установлен в пути python)

1

Другие решения

Я не уверен, но вы используете cpBodyGetAngle(body) не должно быть cpBodyGetAngle(bd) (то же самое для cpBodyGetPos), так как это всегда будет затухать массив до указателя на первый элемент.

Если это не то, что вы ищете, не могли бы вы описать, что не работает? Ваш программный сбой, неожиданные результаты, …

0

По вопросам рекламы [email protected]