在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 个回答
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
的文档。