Я пишу оболочку Python для библиотеки C ++, и я получаю действительно странно при попытке установить поле структуры в C. Если у меня есть структура, подобная этой:
struct Thing
{
PyOBJECT_HEAD
unsigned int val;
};
И есть две функции, подобные этой:
static PyObject* Thing_GetBit(Thing* self, PyObject* args)
{
unsigned int mask;
if(!PyArg_ParseTuple(args, "I", &mask))
Py_RETURN_FALSE;
if((self->val & mask) != 0)
Py_RETURN_TRUE;
Py_RETURN_FALSE;
}
static PyObject* Thing_SetBit(Thing* self, PyObject* args)
{
unsigned int mask;
bool on;
if(!PyArg_ParseTuple(args, "Ii", &mask, &on))
Py_RETURN_FALSE;
if(on)
self->val |= mask;
else
self->val &= ~mask;
Py_RETURN_TRUE;
}
Код Python, который вызывает первый метод, работает просто отлично, возвращая значение члена структуры. Вызов метода SetBit выдает ошибку об объекте по адресу foo , обращающемся к памяти по адресу bar , который не может быть "записан".
Я разбирался в коде, и, похоже, я могу смотреть на значение все, что захочу, как на C, так и на Python, но в тот момент, когда я пытаюсь его установить, оно взрывается у меня на лице. Я что-то упустил здесь?