2010-03-31 72 views
2

我正在写一个C++库Python包装,而我得到一个试图建立一个结构的领域。如果我有这样一个结构,当真正奇怪:为什么在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代码工作正常,返回struct成员的值。调用SetBit方法给出的地址为foo的对象的错误访问存储器地址,它不能被“写入”。

我对代码进行了探索,就像我可以从C和Python中看到所有我想要的值,但是当我试图设置它的时候,它就在我的脸上。我在这里错过了什么?

回答

3

是否有可能通过一个布尔PyArg_ParseTuple的地址是造成你的麻烦? “我”格式将写入一个int大小的东西。

你在跑什么样的机器?

+1

这是一款Core2 Duo笔记本电脑。我认为,Python布尔应该是内部的整数。 编辑:叶神。就是这样。我切换到一个int,并突然它不爆炸。我勒个去*。 – 2010-03-31 20:30:19

+1

@Lee:Python bools可能是整数,但C++不是:-)(例如,它们是Visual C++的字节) – 2010-03-31 20:35:40

+0

让我感到尴尬。 – 2010-03-31 20:43:31

1

它不应该是:

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

Gah。是的,我把它敲出来搞砸了。 – 2010-03-31 20:24:53

相关问题