2010-07-20 2 views
0

Мне нужно преобразовать regexitem * regex в переменную ctype, любые идеи?define * struct in ctypes

функции С ожидает FUNC (regexitem * регулярное выражение)

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 потому, что размер групп не известен заранее.

+0

Игнорирование что-нибудь еще, у вас есть синтаксические ошибки в определении вашего класса. Это должно быть '_fields_', а не' _fields'. – JAB

+0

глупая опечатка, исходный источник имеет это право, но tnx :) – damir

ответ

2

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