STRUCT_ARRAY in your code should be a pointer to a pointer array, not a pointer to an element in the array, as you are appending STRUCT_2 pointers to the array.
In C, STRUCT_ARRAY can be defined as *STRUCT_2[length], aka an array of STRUCT_2 pointers
import ctypes
from random import randint
class STRUCT_2(ctypes.Structure):
#_pack_=2
_fields_ = [('field_1', ctypes.c_short),
('field_2', ctypes.c_short),
('field_3', ctypes.c_short),
('field_4', ctypes.c_short),
('field_5', ctypes.c_short),
('field_6', ctypes.c_short),
('field_7', ctypes.c_short),
('field_8', ctypes.c_short)]
class STRUCT_1(ctypes.Structure):
#_pack_=2
_fields_ = [('elements', ctypes.c_short),
#an array of pointers
('STRUCT_ARRAY', ctypes.POINTER(ctypes.POINTER(STRUCT_2)))]
def __init__(self,num_of_structs):
elems = (ctypes.POINTER(STRUCT_2) * num_of_structs)()
self.STRUCT_ARRAY = ctypes.cast(elems,ctypes.POINTER(ctypes.POINTER(STRUCT_2)))
self.elements = num_of_structs
for num in range(0,num_of_structs):
self.STRUCT_ARRAY[num].field_1 = 1
self.STRUCT_ARRAY[num].field_2 = 2
self.STRUCT_ARRAY[num].field_3 = 3
for num in range(0,100):
test = STRUCT_1(num)
print("%i done" % num)
If instead what you want is an array of structs, use the following code:
import ctypes
from random import randint
class STRUCT_2(ctypes.Structure):
#_pack_=2
_fields_ = [('field_1', ctypes.c_short),
('field_2', ctypes.c_short),
('field_3', ctypes.c_short),
('field_4', ctypes.c_short),
('field_5', ctypes.c_short),
('field_6', ctypes.c_short),
('field_7', ctypes.c_short),
('field_8', ctypes.c_short)]
class STRUCT_1(ctypes.Structure):
#_pack_=2
_fields_ = [('elements', ctypes.c_short),
#an array of structs
('STRUCT_ARRAY', ctypes.POINTER(STRUCT_2))]
def __init__(self,num_of_structs):
elems = (STRUCT_2 * num_of_structs)()
self.STRUCT_ARRAY = ctypes.cast(elems,ctypes.POINTER(STRUCT_2))
self.elements = num_of_structs
for num in range(0,num_of_structs):
self.STRUCT_ARRAY[num].field_1 = 1
self.STRUCT_ARRAY[num].field_2 = 2
self.STRUCT_ARRAY[num].field_3 = 3
self.STRUCT_ARRAY[num].field_4 = 4
for num in range(0,100):
test = STRUCT_1(num)
print("%i done" % num)
Answer from simonzack on Stack OverflowPython ctypes pointer to array of structs - Stack Overflow
python - ctypes struct containing arrays - Stack Overflow
Python ctype struct with array of structs - Stack Overflow
python - ctypes and array of structs - Stack Overflow
I am using this script in my AHK code but while attempting to create a list in a struct, I got an error. I don't know if there is a specific prefix to to the variable I need to use so I am just using the prefix that would go for the values in the array. This is my code:
math := ctypes.struct("float cosvar; float sinvar;")({
cosvar: [0.0],
sinvar: [0.0]
})How should I fix this?
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
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