Почему не удается установить этот элемент в C? - PullRequest
2 голосов
/ 01 апреля 2010

Я пишу оболочку 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, но в тот момент, когда я пытаюсь его установить, оно взрывается у меня на лице. Я что-то упустил здесь?

Ответы [ 2 ]

3 голосов
/ 01 апреля 2010

Возможно ли, что передача адреса bool PyArg_ParseTuple вызывает у вас проблемы? В формате «i» будет записано целое число.

На какой машине вы работаете?

1 голос
/ 01 апреля 2010

Не должно ли быть:

if (on)
    self->val |= mask;
else
    self->val &= ~mask;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...