结构的蟒蛇ctypes的数组 [英] python ctypes array of structs
问题描述
我有followng code和它最终到分段错误。
I have the followng code and it ends up to segmentation fault.
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)]
class STRUCT_1(ctypes.Structure):
#_pack_=2
_fields_ = [('elements', ctypes.c_short),
('STRUCT_ARRAY', 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(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
输出:
5 DONE
分段故障
output: 5 done Segmentation fault
但如果field_3不是struct_2 present那么它似乎正常工作。如果我添加一个短场(field_4)越到结尾段错误...
But if field_3 is not present in struct_2 then it seems to work correctly. If I add one short field (field_4) more it ends to segmentation fault...
所以,做什么我'不正确或什么,我已经在这里错过了??
So what i'am doing incorrectly or what i have missed here??
有someother方法来定义数组的大小?
Is there someother way to define array size?
推荐答案
STRUCT_ARRAY在code应该是一个指向一个指针数组,而不是一个指针数组中的元素,因为要附加STRUCT_2指针该数组。
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.
在C,STRUCT_ARRAY可以定义为* STRUCT_2 [长度],又名STRUCT_2指针数组
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)
如果不是你想要的是结构的数组,请使用以下code:
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)
这篇关于结构的蟒蛇ctypes的数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!