2013-02-21 46 views
1

我想向我的c库发送一个对象数组。投射指向其他对象的数组?

我想发送的对象是一个pymunk Body.It有一个嵌入其中的指针对象Body._body。我能够通过一个单一的功能,并提取花栗鼠功能任何我想要的。我用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++有没有蟒蛇缠绕,所以我只能发送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对象的数组到AC 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的路径默认)

+0

Awsome谢谢!我无法想出两个理由。我不知道C++中的**,我不知道你可以创建一个这样的指针数组。好极了。一个问题。什么'sys.path.insert(0,'..')'做 – Kaliber64 2013-03-05 02:02:48

+0

这是让我的代码找到pymunk。我没有在我的标准python中安装pymunk。所以,path.insert将路径插入到我的本地pymunk文件夹中。在我的情况下,这只是一个文件夹(我在pymunk源代码树中的dump文件夹中有这个代码),但它可能是任何东西..例如,绝对路径在我的情况下是'sys.path.insert (0,'''c:\ svn \ pymunk \ trunk''')' – viblo 2013-03-05 09:58:14

0

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

如果这不是你要找的,你能描述什么不工作吗?请问您的程序崩溃,产生意想不到的结果,...

+0

它工作的唯一方法是如果我只发送一个。我没有将存储这些指针的python数组,以便cpp将读取它们。只有第一个元素会起作用。没有崩溃可能是因为我只是在阅读。它的阅读内存很可能是空白或完全是其他东西。 – Kaliber64 2013-02-21 14:34:34

+0

@ Kaliber64:'如果我做出这些数组。唯一有效的是第一个。“我不能跟着,有没有尝试从python传递数组/列表到c?也许你应该显示你想从python传递给c的代码(最简单的例子)。无论如何一定要检查出这个问题也许它有帮助:http://stackoverflow.com/questions/2307290/pass-array-of-structs-from-python-to-c – ted 2013-02-21 16:08:26

+0

我没有想到一个结构,但我将会开始更多的信息。 – Kaliber64 2013-02-21 18:21:15