将指针数组强制转换为其他对象
Cast an array of pointers to other objects?
我正在尝试向我的c库发送一个对象数组。
我要发送的对象是一个pymunk Body。它嵌入了一个指针对象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字节int组成的数组。cpBody body[]
假定它必须跳到数组中的sizeof(cpBody)(以字节为单位)才能到达下一个对象。但它们并不一致。这是一个指向所有实体的随机指针列表。我需要它读取每个数组元素中的地址,并让它假设在那个位置有一个cpBody
。
如果你看第二个例子。我通过一个指针发送了一个数组。我需要发送一个指向指针数组的指针,并从每个指针中获取cpBody。这意味着我只需要数组跳转4个字节,并将内存地址读取为cpBody
。
这是一个关于发送pymunk数组的方法的简短示例。库的主体对象:
首先是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
相同),因为这将始终使数组衰减为指向第一个元素的指针。
如果这不是你想要的,你能描述一下什么不起作用吗?你的程序是否崩溃,产生意外结果。。。
- 具有包含其他对象的类的对象创建顺序
- 如何在不使用new的情况下保持在其他对象中创建的对象存活?
- 为什么最后一个推回向量的对象的字段会转移到向量的其他对象?
- 通过向构造函数其他对象引用页面来创建对象
- 如何在 opengl 中仅旋转特定对象而不影响其他对象?
- 推断大多数模板对象的参数,但在调用模板函数时对其他对象显式
- neak_ptr vs unique_ptr参考 - 传递接口inmand tos to其他对象
- 修改对象也会修改同一类的所有其他对象
- 提升序列化仅适用于主要?当我在其他对象中使用时,继续说"has no member named ‘serialize’"
- 当对象被其他对象引用时,关于 const 限定符的微妙问题
- boost::可选 - 对对象使用 boost::in_place,构造器通过引用获取其他对象
- 当对象包含其他对象的向量时,无法设置值
- C 序列化包含其他对象数组的对象
- 如何引用其他对象中的对象
- 如果您称为destructor并将分配的内存再次用于其他对象,会发生什么
- 对象必须包含指针成员才能与其他对象通信
- 访问同一类的其他对象的变量
- 随机数向量的值在放置在其他对象向量内时设置为 0。
- OO 正确性 - 继承层次结构 - 谁创建其他对象使用的对象
- 使用带有纹理的.x文件网格会覆盖其他对象的颜色