Доступ к массиву с-структур с использованием Python ctypes - PullRequest
3 голосов
/ 30 ноября 2011

У меня есть C-функция, которая распределяет память по адресу, который передан и доступен через Python. Содержимое указателя содержит массив структур в коде C, но я не могу получить ctypes для правильного доступа к массиву за 0-м элементом. Как я могу получить правильное смещение памяти, чтобы иметь доступ к ненулевым элементам? Ctypes.memset из Python жалуется на TypeErrors, если я пытаюсь использовать их функцию ctypes.memset.

typedef struct td_Group
{
    unsigned int group_id;
    char groupname[256];
    char date_created[32];
    char date_modified[32];
    unsigned int user_modified;
    unsigned int user_created;
} Group;

int getGroups(LIBmanager * handler, Group ** unallocatedPointer);

############# python code below: 
class Group(Structure):
    _fields_ = [("group_id", c_uint),
                ("groupname", c_char*256),
                ("date_created", c_char*32),
                ("date_modified", c_char*32),
                ("user_modified", c_uint),
                ("user_created", c_uint)]


myGroups = c_void_p()
count = libnativetest.getGroups( nativePointer, byref(myGroups) )
casted = cast( myGroups, POINTER(Group*count) )
for x in range(0,count):
    theGroup = cast( casted[x], POINTER(Group) )
    # this only works for the first entry in the array:
    print "~~~~~~~~~~" + theGroup.contents.groupname

Связано: Доступ к c_char_p_Array_256 в Python с использованием ctypes

Ответы [ 2 ]

3 голосов
/ 30 ноября 2011

D Гесс поставил меня в правильном направлении; Решение было:

GroupArray = POINTER(Group * count)
group_array = GroupArray.from_address(addressof(myGroups))
for x in range(0,count):
    print "~~~~~~~~~~" + group_array.contents[x].groupname
3 голосов
/ 30 ноября 2011

Сначала создайте новый тип, который является массивом группы:

GroupArray = Group * count

Затем создайте экземпляр GroupArray следующим образом:

group_array = GroupArray.from_address(myGroups.value)

Тогда ваш цикл будет работать так:

for x in range(0,count):
    print "~~~~~~~~~~" + group_array[x].groupname
...