投射指向其他对象的指针数组?

时间:2013-02-21 10:06:01

标签: c++ python numpy chipmunk pymunk

我正在尝试将一组对象发送到我的c库。

我正在尝试发送的对象是一个pymunk Body.It中嵌入了一个指针对象Body._body。我能够将一个单独的一个传递给我的函数并用Chipmunk函数提取我想要的任何东西。我使用cpBodyGetMass作为测试并且有效。

如果我制作这些数组。唯一有效的是第一个。

我希望能够将Body._body地址作为数组发送到我的dll。我想我可以将指针存储在c_intc_long数组中,并将这些地址转换为Chipmunk想要的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

2 个答案:

答案 0 :(得分:1)

这是一个将pymunk.Body对象数组发送到c lib的方法的简短示例:

首先是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 :(得分:0)

我不确定但您使用cpBodyGetAngle(body)不应该是cpBodyGetAngle(bd)cpBodyGetPos相同),因为它总会将数组衰减为指向第一个元素的指针。

如果这不是你想要的,你能描述一下什么不起作用吗?您的程序是否崩溃,产生意外结果......