在ctypes中定义* struct

时间:2010-07-20 17:51:52

标签: python ctypes

我需要将regexitem * regex转换为ctype变量,任何想法?

C函数需要func(regexitem * regex)

    char *regex1Groups[] = { "a","b","x","s" ,NULL};
    char *regex2Groups[] = { "l" ,NULL};

    regexitem regex[] = {
            {"bla", regex1Groups,4 },
            {"bla2",regex2Groups,1 }
    };

首先我定义了

class regexitem(Structure): 
        _fields = ("regex",c_char_p), ("groups",c_char_p*size), ("groupsize",c_int)

并遇到第一个问题,声明了regexitem数组,因为预先不知道组的大小。

1 个答案:

答案 0 :(得分:2)

结构只能在它们的末尾包含可变长度的数组,并且当你将数组变量分配给你没有复制它的东西时,你要分配数组的第一个元素的内存位置。所以我打赌你的regexitem结构包含一个指向char指针数组的指针,而不是包含char指针数组本身。如果是这种情况,这可能有效:

class regexItem(Structure):
    _fields_ = [("regex", c_char_p),
                ("groups", POINTER(c_char_p)),
                ("groupsize", c_int),
                ]

(如果你愿意的话,你可以将作为元组的元组保留为_fields_,而不是元组列表。)

哦,对于你的正则表达群体来说,它是这样的:

regex1Groups = (c_char_p * 5)("a", "b", "x", "s", None)
regex2Groups = (c_char_p * 2)("l", None)

然后你的regexitem数组就像这样:

regex = (regexItem * 2)(("bla", regex1Groups, 4),
                        ("bla2", regex2Groups, 1))

如果您想了解更多信息,请查看ctypes文档。

http://docs.python.org/library/ctypes.html

相关问题