python ctypes如何映射int **

时间:2012-07-17 09:50:22

标签: python ctypes

有c结构定义

struct Matrix {
    int width;
    int height;
    int** data;
};

如何使用python的ctypes.Struct来定义它?

class Matrix( ctypes.Structure ):
    _fields_ = [
        ( "width", ctypes.c_int ),
        ( "height", ctypes.c_int ),
        ( "data", ??? ),
    ]

我不知道如何定义“数据”的类型。 这里有人帮忙吗?

1 个答案:

答案 0 :(得分:1)

int**的最直译是:

ctypes.POINTER(ctypes.POINTER(ctypes.c_int))

也就是说,它是指向int的指针。

可能更惯用的方式是2D数组:

ctypes.c_int * width * height

,但要做到这一点,你需要知道数组中有多少元素 - 大小是ctypes中类型的一部分。如果看起来像你事先不知道那个大小(并且它可以改变每个struct的实例),那么指向指针的指针是最好的选择。

要实例化这需要更少的间接 - 当你想要创建数组时,根据定义你知道它需要多大。所以,你可以这样做:

m.data = (ctypes.c_int * width * height)()

这将为您提供height长度width长度数组c_int。也就是说,它(广泛地)与C ++代码相同:

m.data = new int[width][height];

或者,如果您愿意:

m.data = (int**) malloc(sizeof(int) * width * height)