ctypes pointer to structure memory swap

Wanderer wanderer at dialup4less.com
Fri Mar 18 13:34:35 EDT 2011


I'm observing some strange behavior with ctypes. I created this test
code to try to figure out what I'm doing wrong creating pointers to
structures.

from ctypes import *

class QCamSettingId(Structure):
    """ QCam_settings_id
    """
    _fields_ = [("f1", c_ulong),
                ("f2", c_ushort),
                ("f3", c_ushort),
                ("f4", c_ubyte * 8)]


class QCamSettingsEx(Structure):
    """ QCam_SettingsEx
    """
    _fields_ = [("size", c_ulong),                         # Filled by
the init routine
                ("pSettingsID", POINTER(QCamSettingId)),   # pointer
to the camera settings ID
                ("private_data", c_void_p )]               # Pointer
to a camera settings array

class QMemDriver():
    """ The wrapper of QCamDriver
    """
    def __init__(self):

        self.QSetID = QCamSettingId()
        self.QSetID_p = pointer(self.QSetID)
        self.QSettings = QCamSettingsEx()
        self.QSettings.pSettingsID = self.QSetID_p
        self.QSettings_p = pointer(self.QSettings)

    def Test(self):
        """
        Test the QCamSettinsEx object
        """
        print self.QSettings.pSettingsID
        print self.QSettings.pSettingsID[0]
        print self.QSettings.pSettingsID
        print self.QSettings.pSettingsID[0]
        print "pSettingsID is at", self.QSettings.pSettingsID
        print "pSettingsID[0] is at", self.QSettings.pSettingsID[0]
        print "pSettingsID is at", self.QSettings.pSettingsID
        print "pSettingsID[0] is at", self.QSettings.pSettingsID[0]


The results I get are.

>>> qmem.Test()
<QMEMTest.LP_QCamSettingId object at 0x011902B0>
<QMEMTest.QCamSettingId object at 0x01426850>
<QMEMTest.LP_QCamSettingId object at 0x011902B0>
<QMEMTest.QCamSettingId object at 0x01426850>
pSettingsID is at <QMEMTest.LP_QCamSettingId object at 0x011902B0>
pSettingsID[0] is at <QMEMTest.QCamSettingId object at 0x01426850>
pSettingsID is at <QMEMTest.LP_QCamSettingId object at 0x011902B0>
pSettingsID[0] is at <QMEMTest.QCamSettingId object at 0x01426850>
>>> qmem = QMEMTest.QMemDriver()
>>> qmem.Test()
<QMEMTest.LP_QCamSettingId object at 0x01426990>
<QMEMTest.QCamSettingId object at 0x014269E0>
<QMEMTest.LP_QCamSettingId object at 0x014269E0>
<QMEMTest.QCamSettingId object at 0x01426990>
pSettingsID is at <QMEMTest.LP_QCamSettingId object at 0x01426990>
pSettingsID[0] is at <QMEMTest.QCamSettingId object at 0x014269E0>
pSettingsID is at <QMEMTest.LP_QCamSettingId object at 0x014269E0>
pSettingsID[0] is at <QMEMTest.QCamSettingId object at 0x01426990>

Sometimes the pointer and the object swap location and sometimes they
don't.



More information about the Python-list mailing list