определить * структуру в ctypes - PullRequest
0 голосов
/ 20 июля 2010

Мне нужно преобразовать регулярное выражение * регулярное выражение в переменную ctype, есть идеи?

Функция C ожидает func (регулярное выражение * регулярное выражение)

    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)

и столкнулся с первой проблемой, объявив массив регулярных выражений, потому что размер групп заранее неизвестен.

1 Ответ

2 голосов
/ 20 июля 2010

Структуры могут содержать только массивы переменной длины на своих концах, и, кроме того, когда вы назначаете переменную массива чему-то, что вы не копируете, вы назначаете ячейку памяти первого элемента массива.Поэтому я уверен, что ваша структура 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 s будет выглядеть так:

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

Просмотритеctypes документация, если вы хотите узнать больше.

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

...