2013-06-14 18 views
5

Ich habe den folgenden Code und es endet bis Segmentierung Fehler.python ctypes Array von Strukturen

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 

Ausgang: 5 getan Segmentation fault

Aber wenn field_3 nicht in struct_2 ist dann scheint es richtig zu arbeiten. Wenn ich ein kurzes Feld (Feld_4) mehr hinzufüge, endet es mit Segmentierungsfehler ...

Also was mache ich falsch oder was habe ich hier verpasst ??

Gibt es eine andere Möglichkeit, die Array-Größe zu definieren?

+0

Warum nicht einfach 'self.STRUCT_ARRAY.append ({" field_1 ": 1," field_2 ": 2," field_3 ": 3})'? – mishik

Antwort

10

STRUCT_ARRAY in Ihrem Code sollte ein Zeiger auf ein Zeigerarray sein, kein Zeiger auf ein Element im Array, da Sie STRUCT_2-Zeiger an das Array anfügen.

In c kann STRUCT_ARRAY als * STRUCT_2 [Länge] definiert werden, auch bekannt als ein Array von STRUCT_2 Zeiger

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) 

Wenn statt, was Sie wollen, ist ein Array von Strukturen, verwenden Sie den folgenden Code ein:

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) 
+0

simonzack: danke – Juster

+0

Wenn ich self.STRUCT_ARRAY im obigen Code über udp.Can übergeben will, sag mir, wie kann ich das tun? Ein weiteres Problem ist in oben genannten Code vorhanden, wenn ich versuche, Feld_1, Feld_2, Feld_3 Variablen zu drucken Werte, es zeigt mir Fehler wie diese AttributeError: 'LP_STRUCT_2' Objekt hat kein Attribut 'Feld_1' –