Я пытаюсь отправить массив объектов в мою библиотеку 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
,
Это краткий пример того, как отправить массив объектов 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)
Я не уверен, но вы используете cpBodyGetAngle(body)
не должно быть cpBodyGetAngle(bd)
(то же самое для cpBodyGetPos
), так как это всегда будет затухать массив до указателя на первый элемент.
Если это не то, что вы ищете, не могли бы вы описать, что не работает? Ваш программный сбой, неожиданные результаты, …