我正在为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,但是当我尝试设置它时,它就会在我的脸上爆炸。我在这里遗漏了一些基本的东西吗?
答案 0 :(得分:3)
传递bool PyArg_ParseTuple的地址是否可能导致您的麻烦? “i”格式将编写一个int大小的东西。
你在运行什么样的机器?
答案 1 :(得分:1)
不应该是:
if (on)
self->val |= mask;
else
self->val &= ~mask;