为什么在C中设置此成员失败?

时间:2010-03-31 20:18:33

标签: python c

我正在为C ++库编写一个Python包装器,当我尝试在C中设置一个struct的字段时,我得到一个真的怪。如果我有这样的结构:

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代码工作正常,返回struct成员的值。调用SetBit方法会在地址 foo 访问内存 bar 的对象时发出错误,该地址无法“写入”。

我已经探索过代码,这就像我可以看到我想要的所有值,无论是来自C还是Python,但是当我尝试设置它时,它就会在我的脸上爆炸。我在这里遗漏了一些基本的东西吗?

2 个答案:

答案 0 :(得分:3)

传递bool PyArg_ParseTuple的地址是否可能导致您的麻烦? “i”格式将编写一个int大小的东西。

你在运行什么样的机器?

答案 1 :(得分:1)

不应该是:

if (on)
    self->val |= mask;
else
    self->val &= ~mask;