Reputation: 187
I have a C-function that allocates memory at the address passed to and is accessed via Python. The pointer contents does contain an array of structs in the C code, but I am unable to get ctypes to access the array properly beyond the 0th element. How can I get the proper memory offset to be able to access the non-zero elements? Python's ctypes.memset is complaining about TypeErrors if I try to use their ctypes.memset function.
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
Related: Access c_char_p_Array_256 in Python using ctypes
Upvotes: 4
Views: 5801
Reputation: 17246
First create a new type which is an array of Group:
GroupArray = Group * count
Then create an instance of a GroupArray this way:
group_array = GroupArray.from_address(myGroups.value)
Then your loop would work like this:
for x in range(0,count):
print "~~~~~~~~~~" + group_array[x].groupname
Upvotes: 3
Reputation: 187
D Hess put me in the right direction; The solution was:
GroupArray = POINTER(Group * count)
group_array = GroupArray.from_address(addressof(myGroups))
for x in range(0,count):
print "~~~~~~~~~~" + group_array.contents[x].groupname
Upvotes: 4