在ctypes中定义*结构

0 投票
1 回答
1130 浏览
提问于 2025-04-16 01:35

我需要把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 个回答

2

结构体(structs)只能在最后放可变长度的数组。而且,当你把一个数组变量赋值给其他东西时,其实并不是在复制这个数组,而是把数组第一个元素的内存地址给了它。所以我猜你的 regexitem 结构体里可能存的是指向字符指针数组的指针,而不是直接包含这个字符指针数组。如果真是这样的话,你可以试试这样做:

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

撰写回答