我正在尝试将一组对象发送到我的 c 库。
我要发送的对象是一个 pymunk Body。它有一个嵌入其中的指针对象Body._body
。我能够将一个单一的传递给我的函数,并使用 Chipmunk 函数提取我想要的任何东西。我cpBodyGetMass
只是用作测试,并且有效。
如果我制作这些数组。唯一有效的是第一个。
我希望能够将Body._body
地址作为数组发送到我的 dll。我想我可以将指针存储在一个c_int
或c_long
数组中,并将这些地址转换为cpBody
Chipmunk 想要的地址。
这是我的自定义功能
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
.