gpt4 book ai didi

python - 在 CFFI 中创建类型为 `REAL (* vertices)[DIM]` 的 cdata

转载 作者:行者123 更新时间:2023-11-30 15:05:17 25 4
gpt4 key购买 nike

我正在尝试围绕一些现有的 C code 构建一个 python 接口(interface)与CFFI。与往常一样,C 代码为了性能而进行了修剪,它充满了大量的宏和类型定义。

ATM 我正在​​努力复制以下结构

#define DIM     3
typedef double REAL;
struct Object_structure {
int numpoints;
REAL (* vertices)[DIM];
int * rings;
};
typedef struct Object_structure * Object;

我尝试调用的函数需要一个 Object 类型的参数。

REAL gjk_distance(
Object obj1, REAL (* tr1)[DIM+1],
Object obj2, REAL (* tr2)[DIM+1],
REAL wpt1[DIM], REAL wpt2[DIM],
struct simplex_point * simplex, int use_seed
);

我已经编写了以下 python 类来表示这样的对象/结构,但我在将其转换为预期的 cdata 对象时遇到了问题。 (目前我只考虑使用 UnitCube,但最终我想概括这一点。)

class Box:
def __init__(self, pos):
self._weakkeydict = weakref.WeakKeyDictionary()
self.numpoints = 8
self.rings = [
8, 12, 16, 20, 24, 28, 32, 36,
3, 1, 4, -1,
0, 2, 5, -1,
1, 3, 6, -1,
2, 0, 7, -1,
7, 5, 0, -1,
4, 6, 1, -1,
5, 7, 2, -1,
6, 4, 3, -1]
x, y, z = pos
self.vertices = [
[x+0, y+0, z+0],
[x+1, y+0, z+0],
[x+1, y+1, z+0],
[x+0, y+1, z+0],
[x+0, y+0, z+1],
[x+1, y+0, z+1],
[x+1, y+1, z+1],
[x+0, y+1, z+1],
]

@property
def cdata(self):
self._weakkeydict.clear()

#ptr_numpoints = ffi.new("int", self.numpoints)
ptr_rings = ffi.new("int[]", self.rings)
vertices = [ffi.new("REAL[3]", v) for v in self.vertices]
ptr_vertices = ffi.new("REAL *[3]", vertices )

ptr_obj = ffi.new("Object", {
'numpoints': self.numpoints,
'rings': ptr_rings,
'vertices': ptr_vertices})
self._weakkeydict[ptr_obj] = (ptr_rings, ptr_vertices, vertices)
return ptr_obj

通过上面的内容,我在 ptr_vertices = ffi.new("REAL *[3 ]", 顶点) 调用时:

box1 = Box((0,0,0)) 
box2 = Box((10,0,0))
d = lib.gjk_distance(
[box1.cdata], ffi.NULL,
[box2.cdata], ffi.NULL,
ffi.NULL, ffi.NULL,
ffi.NULL, 0 )

对我来说,尺寸似乎以某种方式发生了改变。因为它应该是一个包含 3 个元素项的 8 元素数组。我希望有人能在这里为我指出正确的方向。

最佳答案

如果您要创建单个项目,请使用 ffi.new('REAL(*)[3]', [1, 2, 3])* 两边的括号很重要。

在 C 中,类型 REAL(*)[3] 表示指向 REAL 数组 (size=3) 的指针,而 REAL*[3] 表示指向实数的指针数组(大小=3)。请参阅C pointer to array/array of pointers disambiguation详细信息。

现在,您正在创建一个项目数组,CFFI expects an array type相反,as you have already discovered 。这可以类比为:

ffi.new('int*', 1)    # ok
ffi.new('int[]', 1) # wrong
ffi.new('int*', [1, 2, 3]) # wrong
ffi.new('int[]', [1, 2, 3]) # ok

ffi.new('REAL(*)[3]', [0.1, 0.2, 0.3]) # ok
ffi.new('REAL[][3]', [0.1, 0.2, 0.3]) # wrong
ffi.new('REAL(*)[3]', [[0.1, 0.2, 0.3], [0.4, 0.5, 0.6]]) # wrong
ffi.new('REAL[][3]', [[0.1, 0.2, 0.3], [0.4, 0.5, 0.6]]) # ok

关于python - 在 CFFI 中创建类型为 `REAL (* vertices)[DIM]` 的 cdata,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39937895/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com